Database: SQL e non solo

6
L'approccio di Eh ad SQL tenta di creare uno standard, dove ne esisteno tanti (come sempre).
Esistono quindi API per accedere in modo nativo a diverse piattaforme in modo nativo come: ODBC,mySQL e SQLite.

Logica

Le differenze tra le tecnologie sono piccole ma rendono complicato sviluppare e fare manutenzione sui progetti.
Si è realizzato quindi, un insieme di API che si usano nello stesso modo, hanno lo stesso nome, cambia solo il prefisso.
odbc_ per ODBC, mys_ per mySql e sqlite_ per SQLite.
L'approccio di base è che nella maggioranza dei casi non è necessario aprire connessioni multiple su server differenti e non si accede in modo multithread al un sorgente db.
In questo modo non è necessario dichiarare troppe variabili o classi, ma semplicemente si apre una connessione "globale" e le funzioni usano quella.
E' comunque possible usando le API dirette di ogni piattaforma aprire connessioni multiple e multithread.

Inoltre, se si usa un'unica tecnologia in un applicativo, con l'uso di una opportuna macro dichiarata nel preprocessore, si attiva un unico insieme di funzioni sql_ indipendenti dalla piattafoma usata.
Questo rende il condice ancora più semplice ed identico e compatibile, indipendentemente dalla piattaforma.

Precisazione

Il sotto insieme di API non standardizza anche il linguaggio SQL e le sue differenze tra le tecnologie, ma solo il modo in cui si eseguono le Query e si legge il loro risultato.


Attenzione
L'attivazione con la macro, non completa il progetto per l'uso: è necessario includere i sorgenti C delegati ad ogni piattaforma.
Si possono anche usare più piattaforma contemporanee usato i presuffissi diretti.
-

Connessione / Apertura del dbase

Ogni tecnologia ha bisogno di un aprire la connessione con il Db e questa rimane indipendente.

Vediamo ora un esempio di query sql (standard) indimpendente dalla piattaforma.

ODBC

if (!odbc_Connect("<dbname>","<user>","<password>","<Library>",0,FALSE)) {
		MouseCursorDefault();
		ehAlert("Connessione con <dbname>, non realizzabile"); 
		ehExit("");
}

mySql

if (!mys_Connect(sSetup.szMySqlServer,
				 sSetup.szMySqlUser,
				 sSetup.szMySqlPassword,
				 "<schema>",
				 0,
))
				{
ehExit("MYSQL:Ha fallito la connessione al dbase: Error: %s" CRLF,mysql_error(sMYS.mySql));}

SQLite

sprintf(szServ,"%s" OS_DIR_SLASH "info.db",psItf->szProcess);
if (sqlite_open(szServ)) {printf("Errore in apertura db: %s",szServ); return;}

Query e Result Set

L'apprroccio alla query è standardadizzato, di seguito vediamo 3 esempi.
La query in caso di errore ferma l'applicazione e scrive l'errore nel log.
Se si vuole evitare questo inserire come primo carattere ?. (Es. sql_query("?DROP TABLE nome");

Query con comando senza result

	sql_query(
			"CREATE TABLE photo "
			"(IDCODE INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
			"NOME TEXT(50),"
			"CAMERA TEXT(50),"
			"DT_SHOT TEXT(20)) "
		);
Utile per tutti i comandi diretti che non ritornano un result.
La funzione accetta gli argomenti e la sintassi printf.

Query con result (con più righe)

	SQL_RS rsSet;
	sql_query("SELECT IDCODE FROM prodoloc ORDER BY IDCODE");
	rsSet=sql_store();
	while (sql_fetch(rsSet)) {
		INT idLocation=sql_int(rsSet,"IDCODE");
		.
		.
	}
	sql_free(rsSet);

Query con result ad una riga

	SQL_RS rsSet;
	rsSet=sql_row("SELECT DT_RET FROM prodoloc WHERE CODE='%s'",szCode);
	if (rsSet) {// found
		.
		sql_free(rsSet);
	}
Utile per tutte le volte che è necessario avere un unica riga.
See also:
Easyhand C/C++: Database: SQL e non solo | Last modified: 26/06/2013 18.00.25 Europe/Rome | #1.22
P.. 987
Easyhand C/C++
Una mano alle tue idee.
|
Privacy Policy