达梦数据库 ODBC应用程序编程

懵懂的女人 提交于 2019-12-02 00:09:01

达梦数据库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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!