安装ODBC驱动,和Linux上GBASE代码实例

服务端 服务端 1571 人阅读 | 0 人回复

发表于 2023-8-21 15:59:07 | 显示全部楼层 |阅读模式

一、环境搭建。

1:确保南大通用数据库处于开启状态。

可以使用命令 netstat -nptal

3.png

二、Centos7.6机器上安装ODBC驱动

默认情况下会提示 sql.h 文件找不到。

因为下面代码中需要引用sql.h 和sqlert.h 所以需要安装。

yum install unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel


三、测试代码编写和编译运行

代码示例。存为文件名: gs_odbc.c

  1. /**
  2. descript: 纯 C 下用 ODBC 访问数据库。
  3. date: 2010.12.9
  4. notes: gcc gs_odbc.c -o gs_odbc -lgsodbc8 -L /opt/GBase/ODBC/
  5. 需要 libgsodbc8-8.3.81.51.so
  6. **/
  7. #ifndef _GBASE_C_ODBC_H
  8. #define _GBASE_C_ODBC_H
  9. /** 包含文件 **/
  10. #include <stdio.h>
  11. #include <sql.h>
  12. #include <sqlext.h>
  13. /** 简单的宏,用于判断 ODBCAPI 的执行结果是否正确 **/
  14. #define isSuc(result) ((result) == SQL_SUCCESS || (result) == SQL_SUCCESS_WITH_INFO)
  15. /** 可扩展设置 **/
  16. char szConnectString[1024] = "Driver={GBase ODBC 8.3 Driver};Server=localhost;Port=5258;Database=xiaobo;User=sysdba;Password=********;SOCKET=/opt/GBase/Server/tmp/gbase.sock;Option=3;";
  17. //char szConnectString[1024] = "DSN=gbaseodbc;";//Server=localhost;Port=5258;Database=test;Option=3;";
  18. char szSQL1[1024] = "DROP TABLE IF EXISTS test_c";
  19. char szSQL2[1024] = "CREATE TABLE test_c(ID int not null primary key, NAME varchar(20),DATE date, TIME time, Timestamp timestamp, TEXT text)";
  20. char szSQL3[1024] = "INSERT INTO test_c VALUES(0,'AAA','2010-12-09','12:12:12','2010-12-09 12:12:12','ABC')";
  21. char szSQL4[1024] = "SELECT * FROM test_c";
  22. /** 输出缓存 **/
  23. char szDriverOutput[256];
  24. short sDriverOutputLength;
  25. /** 用于测试的变量 **/
  26. int id_r = 0;
  27. char name_r[255];
  28. char date_r[255];
  29. char time_r[255];
  30. char timestamp_r[255];
  31. char text_r[255];
  32. long temp = 0;
  33. /** 用于测试的主函数 **/
  34. int main(){
  35. short sret; //返回代码
  36. void* henv; //环境句柄
  37. void* hdbc; //连接句柄
  38. long mode;//提交模式
  39. void* hsmt; //语句句柄
  40. /** 申请环境句柄 **/
  41. sret = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
  42. if(!isSuc(sret))printf("申请环境句柄出错\n");
  43. /** 设置环境属性,声明 ODBC 版本 **/
  44. sret = SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,SQL_IS_INTEGER);
  45. if(!isSuc(sret))printf("声明 ODBC 版本出错\n");
  46. /** 申请连接句柄 **/
  47. sret = SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
  48. if(!isSuc(sret))printf("申请连接句柄出错\n");
  49. /** 设置连接属性 **/
  50. sret = SQLSetConnectAttr(hdbc,SQL_ATTR_AUTOCOMMIT,(void*)SQL_AUTOCOMMIT_OFF,SQL_IS_INTEGER);
  51. if(!isSuc(sret))printf("设置连接属性出错\n");
  52. /** 取得连接属性 **/
  53. sret = SQLGetConnectAttr(hdbc,SQL_ATTR_AUTOCOMMIT,(void*)&mode,sizeof(mode) +
  54. 1,NULL);
  55. if(!isSuc(sret))printf("取得连接属性出错\n");
  56. /** 连接数据源 **/
  57. sret = SQLDriverConnect(hdbc,NULL,(unsigned char
  58. *)szConnectString,SQL_NTS,(unsigned char
  59. *)szDriverOutput,256,&sDriverOutputLength,SQL_DRIVER_NOPROMPT);
  60. if(!isSuc(sret))printf("连接数据源出错\n");
  61. /** 分配语句句柄 **/
  62. sret = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hsmt);
  63. if(!isSuc(sret))printf("分配语句句柄出错\n");
  64. /** 执行语句 **/
  65. sret = SQLExecDirect(hsmt,(SQLCHAR *)szSQL1,SQL_NTS);
  66. if(!isSuc(sret))printf("执行 DROP TABLE 语句出错\n");
  67. sret = SQLExecDirect(hsmt,(SQLCHAR *)szSQL2,SQL_NTS);
  68. if(!isSuc(sret))printf("执行 CREATE TABLE 语句出错\n");
  69. sret = SQLExecDirect(hsmt,(SQLCHAR *)szSQL3,SQL_NTS);
  70. if(!isSuc(sret))printf("执行 INSERT 语句出错\n");
  71. sret = SQLExecDirect(hsmt,(SQLCHAR *)szSQL4,SQL_NTS);
  72. if(!isSuc(sret))printf("执行 SELECT 语句出错\n");
  73. /** 绑定结果集和获得数据 **/
  74. SQLBindCol(hsmt,1,SQL_C_LONG,&id_r,sizeof(id_r),&temp);
  75. SQLBindCol(hsmt,2,SQL_C_CHAR,&name_r,sizeof(name_r),&temp);
  76. SQLBindCol(hsmt,3,SQL_C_CHAR,&date_r,sizeof(date_r),&temp);
  77. SQLBindCol(hsmt,4,SQL_C_CHAR,&time_r,sizeof(time_r),&temp);
  78. SQLBindCol(hsmt,5,SQL_C_CHAR,×tamp_r,sizeof(timestamp_r),&temp);
  79. SQLBindCol(hsmt,6,SQL_C_CHAR,&text_r,sizeof(text_r),&temp);
  80. /** 取得数据 **/
  81. while(1){
  82. /** 滚动游标 **/
  83. sret = SQLFetchScroll(hsmt,SQL_FETCH_NEXT,0);
  84. /**
  85. 前面如果发生错误,这里很可能得不到 SQL_NO_DATA_FOUND 而发生死循环,
  86. 所以不用 SQL_NO_DATA_FOUND 来判断,而用 SQL_SUCCESS 来判断,但这句在杂复的程
  87. 序中里依然有用。
  88. **/
  89. //if (sret == SQL_NO_DATA_FOUND) break; //如果没有数据就中断。
  90. if (sret != SQL_SUCCESS) break;
  91. printf("id = %d\r\n",id_r);
  92. printf("name = %s\r\n",name_r);
  93. printf("date = %s\r\n",date_r);
  94. printf("time = %s\r\n",time_r);
  95. printf("timestamp = %s\r\n",timestamp_r);
  96. printf("text = %s\r\n",text_r);
  97. }
  98. /** 释放语句句柄 **/
  99. SQLFreeHandle(SQL_HANDLE_STMT,hsmt);
  100. /** 提交连接的事务 **/
  101. SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT);
  102. /** 断开与数据源的连接 **/
  103. SQLDisconnect(hdbc);
  104. /** 释放连接句柄 **/
  105. SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
  106. /** 释放环境句柄 **/
  107. SQLFreeHandle(SQL_HANDLE_ENV,henv);
  108. }
  109. #endif
复制代码

1.png

2.png

在运行的时候,需要提供libgsodbc8-8.3.81.51.so提供给程序调用。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则