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.
- EH_SQL_ODBC
Definisce EH_ODBC e l'uso delle funzioni sql_ con ODBC
- EH_SQL_MYSQL
Definisce _MYSQL e l'uso delle funzioni sql_ con mySQL
- EH_SQL_SQLITE
Definisce EH_SQLITE e l'uso delle funzioni sql_ con SQLite
Includo /easyhand/lib/win32/ehSql9.lib
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.