2015-08-07 17 views
8

Suppongo, ho tutti i prerequisiti per l'impostazione della connessione e l'interrogazione del database SQL Server, poiché posso farlo dal mio codice Python. E lo faccio così:Come connettere ed eseguire una semplice query a SQL Server da C++ su Linux

#1. Set connection using pyodbc library 

db = pyodbc('DRIVER=FreeTDS;SERVER='+host+';PORT='+port+';DATABASE='+ \ 
      db_name+ ';UID='+ user+ ';PWD='+ pwd+ ';TDS_Version=7.0;ClientCharset=UTF8;') 

#2. List all table names in a particular database 

cursor = db.cursor() 
cursor.execute('SELECT TABLE_NAME FROM ' + db_name + '.INFORMATION_SCHEMA.Tables WHERE ' + \ 
'TABLE_TYPE=\'BASE TABLE\'') 
res = cursor.fetchall() 

E ho finito. Ora voglio implementare la stessa cosa, usando C++. Ho visto alcuni codici di esempio come this, ma sembrano terribilmente terribili con cinque nidi uno if s in un altro. Ma ho bisogno di qualcosa di veramente semplice, tenendo conto del fatto che probabilmente tutti i prerequisiti sono soddisfatti (se possibile, per favore, istruisci su cos'altro dovrebbe essere installato).

L'ultima cosa che voglio sapere è in effetti come compilare questo programma (normalmente lo faccio usando g++). E, per favore, non inviare solo riferimenti a FreeTDS e ODBC - li ho già visti. Quello che voglio in questo momento è un piccolo esempio minimizzato di eseguire la query più semplice del mondo (come ho fatto sopra, usando Python).

+0

Penso che tu sia meglio alla ricerca di una libreria client SQL C++. Qualcosa come http://otl.sourceforge.net/otl3_intro.htm – marom

+0

Perché non dovrei usare 'FreeTDS', se funziona già nei miei programmi' Python'? – Jacobian

+0

Beh, non conosco quella libreria, ma se è possibile avere collegamenti C++. – marom

risposta

5

Questo non è testato con il driver freetds di unixodbc. Ecco come ho installato unixodbc con postgres o mysql. http://k3ut0i.github.io/linux/2015/08/09/odbc-setup-linux.html

L'impostazione globale di piloti e fonti di dati per ODBC sono in /etc/odbc.ini e /etc/odbcinst.ini. alcuni sistemi operativi possono avere questi nomi vuoti o differenet. Ecco i miei file di configurazione.

Driver, librerie nel file /etc/odbcinst.ini.

[MySQL] 
    Description  = ODBC driver for mariaDB 
    Driver   = /usr/lib/libmyodbc.so 
    Setup   = /usr/lib/libmyodbc5S.so 
    FileUsage  = 1 

la funzione pyodbc nel file python equivale una sorgente dati in file di /etc/odbc.ini.

[mariadb-connector] 
    Description  = connection to test database for mariadb 
    Driver   = MySQL 
    Database  = test 
    Server   = 127.0.0.1 
    UserName  = keutoi 
    Trace   = No 
    Port   = 3306 

Parte del codice che collega e interroga. Ho appena iniziato dal tuo link e l'ho ripulito.

 /** 
     * Connect to data source named in /etc/odbc.ini file 
     */ 
     retcode = SQLDriverConnect(hdbc, NULL, (SQLCHAR*)"DSN=mariadb-connector;", SQL_NTS, outstr, sizeof(outstr), &outstrlen, SQL_DRIVER_COMPLETE); 
     check_error(retcode, "connect to the data source"); 

     //Allocate statement handle 
     retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
     check_error(retcode, "allocate a statement handle"); 

     /** 
     * statement to be executed. 
     */ 
     retcode = SQLExecDirect (hstmt, (SQLCHAR *) "select * from mytable", SQL_NTS); 
     check_error(retcode, "execute the statement"); 

     /** 
     * Bind a column to a variable 
     */ 
     retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, szName, NAME_LEN, &cbName); 
     check_error(retcode, "bind 1 column to the statement"); 
     retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, szID, ID_LEN, &cbID); 
     check_error(retcode, "bind 2 column to the statement"); 

     /** 
     * fetch sql hstmt untill there is no data and print 
     */ 
     for (int i=0 ; ; i++) 
     { 
      retcode = SQLFetch(hstmt); 
      if(retcode == SQL_NO_DATA)break; 
      else printf("%d: %s %s %s\n", i + 1, szID, szName); 
     } 

L'esempio completo è here. Compilare con g++ file.cc -lodbc

+0

Grazie! Non l'ho ancora provato, ma sembra molto promettente. – Jacobian

1

Questo esempio sembra piuttosto semplice senza molto meno se.

http://dev.mysql.com/doc/connector-cpp/en/connector-cpp-examples-complete-example-1.html

+0

Oh, Dio! Sembra che le persone provino a rispondere alle domande prima di leggerle. Guarda: il titolo della domanda riguarda SQL Server. Non sto chiedendo di MongoDB o Postgres o Oracle o qualsiasi altro database. Quindi, postare qui riferimento al connettore mysql 'mysql_connection.h' non ha assolutamente senso. Scusate. – Jacobian

1
+0

"E, per favore, non pubblicare solo riferimenti a FreeTDS e ODBC - li ho già visti." - questa è una citazione dalla mia domanda. Non si fa riferimento solo a ODBC, si fa riferimento anche allo stesso esempio che faccio nella mia domanda. – Jacobian

Problemi correlati