odbc c语言 linux,Linux/Unix下ODBC的安装、配置与编程(三)

第六:关于上述情况中的错误信息处理

我们需要定义两个变量:

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 DSN

SQL_FETCH_FIRST_SYSTEM 设定SQLDataSources()函数找到第一个System DSN

SQL_FETCH_NEXT 找到下一个数据源,至于数据源类型则要根据前面的定义

到这里,我们在Unix的C语言下面进行ODBC编程已经讲完,上述ODBC API需要引用以下几个头文件(这些文件已经安装到/usr/include下了):

#include

#include

#include

另外如果大家使用GTK进行编程,由于到目前为止GTK还没有加入专门处理数据库的部件,所以大家可以在GTK中调用上述的ODBC API即可。

这里附上例程供大家参考学习:

/* odbc.c

testing unixODBC

*/

#include

#include

#include

#include

#include

SQLHENV V_OD_Env; // Handle ODBC environment

long V_OD_erg; // result of functions

SQLHDBC V_OD_hdbc; // Handle connection

char V_OD_stat[10]; // Status SQL

SQLINTEGER 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 version

V_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 timeout

V_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/。

个人简介:

齐亮,有幸于2001年参与Happy Linux 3.0的研发工作,对Linux情有独钟,现在从事Linux/Windows跨平台应用的开发,欢迎您通过电子邮件 cavendish@eyou.com跟他联系,希望能与更多的朋友交流关于Linux方面的知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值