天天看点

centos7配置mysql的odbc_linux下配置ODBC连接MySql | 学步园

第六:关于上述情况中的错误信息处理我们需要定义两个变量:long V_OD_erg;SQLINTEGER V_OD_err;SQLAllocHandle、SQLSetEnvAttr、SQLSetConnectAttr、SQLConnect、SQLExecDirect、SQLNumResultCols和SQLRowCount的调用结果都可以用V_OD_erg来存储,V_OD_err可以获得SQLBindCol中的错误信息。第七:获得本机的DSN信息我们可以在声明SQLHENV句柄之后,使用SQLDataSources函数来获得本机的DSN信息。程序如下:void OD_ListDSN(void){char l_dsn[100],l_desc[100];short int l_len1,l_len2,l_next;l_next=SQL_FETCH_FIRST;while( SQLDataSources(V_OD_Env,l_next,l_dsn, sizeof(l_dsn),&l_len1, l_desc, sizeof(l_desc), &l_len2) == SQL_SUCCESS){printf("Server=(%s) Beschreibung=(%s)",l_dsn,l_desc);l_next=SQL_FETCH_NEXT;}}l_next变量是用来指定我们所要获得的DSN的类别:SQL_FETCH_FIRST 设定SQLDataSources()函数找到第一个可用的数据源(可以是User DSN,也可以是Systerm DSN)SQL_FETCH_FIRST_USER 设定SQLDataSources()函数找到第一个User DSNSQL_FETCH_FIRST_SYSTEM 设定SQLDataSources()函数找到第一个System DSNSQL_FETCH_NEXT 找到下一个数据源,至于数据源类型则要根据前面的定义到这里,我们在Unix的C语言下面进行ODBC编程已经讲完,上述ODBC API需要引用以下几个头文件(这些文件已经安装到/usr/include下了):#include #include #include 另外如果大家使用GTK进行编程,由于到目前为止GTK还没有加入专门处理数据库的部件,所以大家可以在GTK中调用上述的ODBC API即可。这里附上例程供大家参考学习:#include #include #include #include #include SQLHENV V_OD_Env; // Handle ODBC environmentlong V_OD_erg; // result of functionsSQLHDBC V_OD_hdbc; // Handle connectionchar V_OD_stat[10]; // Status SQLSQLINTEGER V_OD_err,V_OD_rowanz,V_OD_id;SQLSMALLINT V_OD_mlen,V_OD_colanz;char V_OD_msg[200],V_OD_buffer[200];int main(int argc,char *argv[]){// 1. allocate Environment handle and register versionV_OD_erg=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)){printf("Error AllocHandle");exit(0);}V_OD_erg=SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)){printf("Error SetEnv");SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);exit(0);}// 2. allocate connection handle, set timeoutV_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)){printf("Error AllocHDB %d",V_OD_erg);SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);exit(0);}SQLSetConnectAttr(V_OD_hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);// 3. Connect to the datasource "web"V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "Test", SQL_NTS,(SQLCHAR*) "root", SQL_NTS,(SQLCHAR*) "", SQL_NTS);if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)){printf("Error SQLConnect %d",V_OD_erg);SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1,V_OD_stat, &V_OD_err,V_OD_msg,100,&V_OD_mlen);printf("%s (%d)",V_OD_msg,V_OD_err);SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);exit(0);}printf("Connected !");V_OD_erg=SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)){printf("Fehler im AllocStatement %d",V_OD_erg);SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);printf("%s (%d)",V_OD_msg,V_OD_err);SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);exit(0);}SQLBindCol(V_OD_hstmt,1,SQL_C_CHAR, &V_OD_buffer,150,&V_OD_err);SQLBindCol(V_OD_hstmt,2,SQL_C_ULONG,&V_OD_id,150,&V_OD_err);V_OD_erg=SQLExecDirect(V_OD_hstmt,"SELECT dtname,iduser FROM web order by iduser",SQL_NTS);if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)){printf("Error in Select %d",V_OD_erg);SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);printf("%s (%d)",V_OD_msg,V_OD_err);SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);exit(0);}V_OD_erg=SQLNumResultCols(V_OD_hstmt,&V_OD_colanz);if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)){SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);SQLDisconnect(V_OD_hdbc);SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);exit(0);}printf("Number of Columns %d",V_OD_colanz);V_OD_erg=SQLRowCount(V_OD_hstmt,&V_OD_rowanz);if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)){printf("Number of RowCount %d",V_OD_erg);SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);SQLDisconnect(V_OD_hdbc);SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);exit(0);}printf("Number of Rows %d",V_OD_rowanz);V_OD_erg=SQLFetch(V_OD_hstmt);while(V_OD_erg != SQL_NO_DATA){printf("Result: %d %s",V_OD_id,V_OD_buffer);V_OD_erg=SQLFetch(V_OD_hstmt);} ;SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);SQLDisconnect(V_OD_hdbc);SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);return(0);}2.QT下进行ODBC编程QT 3.0提供了Data Table、Data Browser和Data View三个与数据库相关的控件。你可以在QT的Project设置你要连接的数据库,Driver一栏中选择QODBC3即可,其它选项你一看就明白了。上述的三个数据库控件的使用方法可以参见QT中相应文档,也很好使用的。参考资料:1. 微软的ODBC主页:http://www.microsoft.com/data/odbc/;2. UnixODBC的主页:http://www.unixodbc.org;3. FreeODBC的主页:http://www.jepstone.net/FreeODBC/;4. EasySoft的主页:http://www.easysoft.com;5. TrollTech的QT 3.0文档主页:http://doc.trolltech.com/3.0/。