ODBC总结

引用头文件:sql.hsqlext.hsqltypes.h

添加库文件:odbc32.lib   odbccp32.lib

1.定义环境变量:

SQLHENV  henv =nullptr;//环境句柄
SQLHDBC hdbc = nullptr;  //链接句柄
SQLHSTMT hstmt = nullptr;//语句句柄
   SQLRETURN result;   //返回值
   SQLCHAR ConnStrIn[MAXBUFLEN] = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=127.0.0.1;UID=root;PWD=root;DATABASE=rupeng;CharSet=gbk;";
SQLCHAR ConnStrOut[MAXBUFLEN];

Driver Manager 进行控制,配置环境属性,保存配置好的数据源名称,ODBC版本号,用户IP,用户ID,密码等

 

2.初始化环境:

//分配环境句柄
    result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
//设置管理环境属性
    result = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

应用程序调用SQLAllocHandle分配链接句柄,通过SQLConnectSQLBrowseConnect与数据链接

SQLConnect/SQLBrowseConnect链接函数,输入参数为:

  配置好的数据源名称

  ODBC版本号

  用户IP

  用户ID

  密码等

3.链接:

//分配连接句柄
    result = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
//设置连接属性
    result = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*)LOGIN_TIMEOUT, 0);
//连接数据库
    result = SQLDriverConnect(hdbc,NULL,
                              ConnStrIn,SQL_NTS,
                              ConnStrOut,MAXBUFLEN,
                           (SQLSMALLINT*)0,SQL_DRIVER_NOPROMPT);
    if(SQL_ERROR==result)
    {
       ShowDBConnError(hwnd,hdbc);
       return;
    }

处理任何SQL语句之前,应用程序还需要首先分配一个语句句柄

语句句柄含有具体的SQL语句以及输出的结果等信息

应用程序还可以通过SQLtStmtAttr来设置语句属性(也可以使用默认值)

4.数据,执行SQL语句:

result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
result = SQLPrepare(hstmt,(SQLCHAR*)"select FName,FNumber from rupeng1",SQL_NTS);
CHECKDBSTMTERROR(hwnd,result,hstmt);
    result =SQLExecute(hstmt);
    CHECKDBSTMTERROR(hwnd,result,hstmt);

  SQLINTEGER cbsatid=SQL_NTS;

 

应用程序处理SQL语句的两种方式:

 

预处理(SQLPrepareSQLExecute适用于语句的多次执行)

 

直接执行(SQLExecdirect

 

如果SQL语句含有参数,应用程序为每个参数调用SQLBindParameter,并把他们绑定至应用程序变量

应用程序可以直接通过改变应用程序缓冲区的内容从而在程序中动态的改变SQL语句的执行

应用程序根据语句的类型进行的处理

有结果集的语句(select或是编目函数),则进行结果集处理。

没有结果集的函数,可以直接利用本语句句柄继续执行新的语句或是获取行计数(本次执行所影响的行数)之后继续执行。

在插入数据时,采用了预编译的方式,首先通过SQLPrepare来预处理SQL语句,将每一列绑定到用户缓冲区。

应用程序可以直接修改结果集缓冲区的内容

5.处理:

while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND)   //逐行读取
  { 
   SQLINTEGER i;
   SQLGetData(hstmt,2,SQL_C_LONG,&i,sizeof(i),&cbsatid); 
   TCHAR s[20];
   wsprintf(s,TEXT("年龄是:%d"),i);
    
  
   TCHAR name[20]; 
   SQLGetData(hstmt,1,SQL_C_CHAR,name,sizeof(name)/sizeof(SQLCHAR),&cbsatid); 
   MessageBox(hwnd,name,TEXT(""),MB_OK);

6.处理:

SQLFreeStmt(hstmt,SQL_CLOSE);
    SQLDisconnect(hdbc);
    SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV,henv);
MessageBox(hwnd,TEXT("执行成功"),TEXT("标题"),MB_OK);
}

 

posted @ 2017-12-13 09:07  ye_ming  阅读(262)  评论(0编辑  收藏  举报