达梦数据库ODBC编程
DM7 ODBC编程
DM ODBC 3.0 遵照Microsoft ODBC 3.0规范设计与开发,实现了ODBC应用与DM数据库的互连接口。
ODBC API
在<sql.h>头文件中对ODBC中使用的句柄定义如下:
/*handle type identifiers */
#if (ODBCVER >= 0x0300)
#define SQL_HANDLE_ENV 1
#define SQL_HANDLE_DBC 2
#define SQL_HANDLE_STMT 3
#define SQL_HANDLE_DESC 4
#endif
- 申请环境句柄
HENV henv;
SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);
SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
- 申请连接句柄
HDBC hdbc;
SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
- 连接数据源
SQLRETURN sret;
SQLCHAR msg[128];
SQLCHAR state[128];
SQLINTEGER error_id;
SQLSMALLINT text;
SQLCHAR szConnStrIn[1024] = "SERVER=127.0.0.1;DRIVER=DM7 ODBC DRIVER;UID=SYSDBA;PWD=SYSDBA;";
SQLCHAR szConnStrOut[1024];
SQLSMALLINT cbConnStrOut;
SQLDriverConnect(hdbc,GetDesktopWindow(),szConnStrIn,SQL_NTS,szConnStrOut,1024,&cbConnStrOut,SQL_DRIVER_NOPROMPT);
if( sret == SQL_ERROR)
{
SQLGetDiagRec(SQL_HANDLE_DBC,hdbc,1,state,&error_id,msg,128,&text);
}
- 设置连接属性-非自动提交
SQLSetConnectAttr(hdbc,SQL_ATTR_AUTOCOMMIT,(SQLPOINTER)SQL_AUTOCOMMIT_OFF,SQL_IS_INTEGER);
- 申请语句句柄
HSTMT stmt;
SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&stmt);
- 准备SQL语句
SQLPrepare(stmt,(SQLCHAR*)sql,(SQLINTEGER)strlen(sql));
- 执行SQL语句
SQLExecute(stmt);
- 提交执行
SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT);
- 释放资源
SQLFreeHandle(SQL_HANDLE_STMT,stmt);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
完整示例
在达梦数据库中创建test_odbc表,使用ODBC批量插入数据。
create table test_odbc(c1 int);
#include<windows.h>
#include<sql.h>
#include<sqltypes.h>
#include<sqlext.h>
#include<stdio.h>
#define ROW_SIZE 1000
int main(int argc,char **argv)
{
HENV henv;
HDBC hdbc;
HSTMT stmt;
SQLRETURN sret;
char sql[1024];
SQLCHAR szConnStrIn[1024] = "SERVER=127.0.0.1;DRIVER=DM7 ODBC DRIVER;UID=SYSDBA;PWD=SYSDBA;";
SQLCHAR szConnStrOut[1024];
SQLSMALLINT cbConnStrOut;
int c1[ROW_SIZE];
int i;
SQLCHAR msg[128];
SQLCHAR state[128];
SQLINTEGER error_id;
SQLSMALLINT text;
SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);
SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
sret = SQLDriverConnect(hdbc,GetDesktopWindow(),szConnStrIn,SQL_NTS,szConnStrOut,1024,&cbConnStrOut,SQL_DRIVER_NOPROMPT);
if( sret == SQL_ERROR)
{
SQLGetDiagRec(SQL_HANDLE_DBC,hdbc,1,state,&error_id,msg,128,&text);
printf("connect failed! sqlstate=%s,errormsg=%s\n",state,msg);
return -1;
}
SQLSetConnectAttr(hdbc,SQL_ATTR_AUTOCOMMIT,(SQLPOINTER)SQL_AUTOCOMMIT_OFF,SQL_IS_INTEGER);
sprintf(sql,"insert into test_odbc values(?)");
for (i = 0;i<ROW_SIZE;i++)
{
c1[i] = i;
}
SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&stmt);
SQLPrepare(stmt,(SQLCHAR*)sql,(SQLINTEGER)strlen(sql));
SQLSetStmtAttr(stmt,SQL_ATTR_PARAM_BIND_TYPE,(void*)(sizeof(int)),SQL_IS_INTEGER);
SQLSetStmtAttr(stmt,SQL_ATTR_PARAMSET_SIZE,(SQLPOINTER)ROW_SIZE,SQL_IS_INTEGER);
SQLBindParameter(stmt,1,SQL_PARAM_INPUT,SQL_C_LONG,SQL_NUMERIC,10,0,&c1,sizeof(int),NULL);
sret = SQLExecute(stmt);
SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT);
if( sret == SQL_ERROR)
{
SQLGetDiagRec(SQL_HANDLE_DBC,hdbc,1,state,&error_id,msg,128,&text);
printf("insert failed! sqlstate=%s,errormsg=%s\n",state,msg);
return -1;
}
SQLFreeHandle(SQL_HANDLE_STMT,stmt);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
return 0;
}
来源:CSDN
作者:汀畔柳絮
链接:https://blog.csdn.net/lucky_fly/article/details/84245161