達夢資料庫 ODBC應用程式程式設計
阿新 • • 發佈:2019-01-31
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;
}