1. 程式人生 > >達夢資料庫 ODBC應用程式程式設計

達夢資料庫 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
  1. 申請環境控制代碼
HENV henv;
SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);
SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);
  1. 申請連線控制代碼
HDBC hdbc;
SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
  1. 連線資料來源
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);
}
  1. 設定連線屬性-非自動提交
SQLSetConnectAttr(hdbc,SQL_ATTR_AUTOCOMMIT,(SQLPOINTER)SQL_AUTOCOMMIT_OFF,SQL_IS_INTEGER);
  1. 申請語句控制代碼
HSTMT stmt;
SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&stmt);
  1. 準備SQL語句
SQLPrepare(stmt,(SQLCHAR*)sql,(SQLINTEGER)strlen(sql));
  1. 執行SQL語句
SQLExecute(stmt);
  1. 提交執行
SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT);
  1. 釋放資源
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;
}