雪月灵妖 发表于 2010-12-1 14:28:25

vc下c语言用ODBC连接数据库流程+示例

ODBC应用程序流程
初始部分
   分配环境句柄
   设置环境属性
   分配连接句柄(在分配连接句柄前,最好先设置环境句柄所用的ODBC参数)
   设置环境属性
   建立连接
主体部分
   分配语句句柄
   执行语句
   释放语句句柄
结束部分
   释放语句句柄
   断开数据源连接
   释放连接句柄   
   释放环境句柄

具体API流程
初始部分
分配句柄
   SQLAllocHandle
设置环境属性
   SQLSetEnvAttr
设置连接属性
   SQLSetConnectAttr
连接数据库
   建立的连接方式有三种: 详细:http://technet.microsoft.com/zh-cn/library/ms131326.aspx
   SQLConnect          (需添加ODBC 数据源中的DSN)

   SQLDriverConnect (不需添加ODBC 数据源中的DSN)

   SQLBrowseConnect

主体部分
执行SQL命令的两种方式

直接执行方式
   SQLExecdirect
   SQLBindCol
   SQLFetch
预处理执行方式
   SQLPrepare
   SQLBindParameter
   SQLExecute
   预处理-执行方式适用于SQL语句中含有参数的情况,或大批量多次执行的情况

结束部分
释放句柄
   SQLFreeHandle(HandleType,handleName)
断开连接
   SQLDisconnect(语句句柄)
顺序必须遵循
   SQLFreeHandle(SQL_HANDLE_STMT,   hstmt);   
   SQLDisconnect(hdbc);   
   SQLFreeHandle(SQL_HANDLE_DBC,   hdbc);   
   SQLFreeHandle(SQL_HANDLE_ENV,   henv);


示例:



注:WINDOWS系统vc中在引用sqlext.h或sql.h文件之前必须引用windows.h   ;因为sql.h中引用了windows.h的一些定义方法。

/*c语言连接ODBC模板 BY:wwww.demonelf.com*/
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
#define LOGIN_TIMEOUT 30
#define MAXBUFLEN 255
#define CHECKDBSTMTERROR(result,hstmt) if(SQL_ERROR==result){ShowDBStmtError(hstmt);return;}
void DBTest();
int main()
{
DBTest();
return 0;
}
void ShowDBError(SQLSMALLINT type,SQLHANDLE sqlHandle)
{
char pStatus, pMsg;
SQLSMALLINT SQLmsglen;
char error = {0};
SQLINTEGER SQLerr;
long erg2 = SQLGetDiagRec(type, sqlHandle,1,(SQLCHAR *)pStatus,&SQLerr,(SQLCHAR *)pMsg,100,&SQLmsglen);
wsprintf(error,"%s (%d)\n",pMsg,(int)SQLerr);
MessageBox(NULL,error,TEXT("数据库执行错误"),MB_ICONERROR|MB_OK);
}
void ShowDBConnError(SQLHDBC hdbc)
{
ShowDBError(SQL_HANDLE_DBC,hdbc);
}
void ShowDBStmtError(SQLHSTMT hstmt)
{
ShowDBError(SQL_HANDLE_STMT,hstmt);
}
void DBTest()
{
SQLHENV henv = NULL; //环境句柄
SQLHDBC hdbc = NULL; //连接句柄
SQLHSTMT hstmt = NULL; //语句句柄
SQLRETURN result;

SQLINTEGER cbsatid; //返回当前得到的字段的字节长度

//连接access
SQLCHAR ConnStrIn = "Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\Documents and Settings\\Administrator\\桌面\\lvdian.mdb;Uid=;Pwd=;CharSet=gbk;";
//连接mysql
//SQLCHAR ConnStrIn = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=127.0.0.1;UID=root;PWD=root;DATABASE=test;CharSet=gbk;";
SQLCHAR ConnStrOut;
/*******************************初始部分**********************************/
//分配环境句柄
result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
//设置环境属性
result = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
//分配连接句柄
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(hdbc);
return;
}
/*******************************主体部分**********************************/
//分配语句句柄
result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
//创建SQL语句
result = SQLPrepare(hstmt,(SQLCHAR*)"SELECT 床数,类型 FROM T_fangjian",SQL_NTS);
CHECKDBSTMTERROR(result,hstmt);
//执行SQL语句
result =SQLExecute(hstmt);
CHECKDBSTMTERROR(result,hstmt);

while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND)
{
SQLCHAR name;
SQLGetData(hstmt,2,SQL_C_CHAR,name,20,&cbsatid);
MessageBox(NULL,name,"类型",MB_OK);
}

//释放语句句柄
SQLFreeStmt(hstmt,SQL_CLOSE);
/*******************************结束部分**********************************/
//释放句柄
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
//断开连接
SQLDisconnect(hdbc);
MessageBox(NULL,TEXT("执行成功"),TEXT("标题"),MB_OK);
}
unixodbc示例:/* odbc.c

    testing unixODBC
*/
#include <stdlib.h>
#include <stdio.h>
#include <odbc/sql.h>
#include <odbc/sqlext.h>
#include <odbc/sqltypes.h>

SQLHENV                       V_OD_Env;                        // Handle ODBC environment
long                       V_OD_erg;                        // result of functions
SQLHDBC                       V_OD_hdbc;                        // Handle connection

char                       V_OD_stat;                // Status SQL
SQLINTEGER               V_OD_err,V_OD_rowanz,V_OD_id;
SQLSMALLINT               V_OD_mlen,V_OD_colanz;
char             V_OD_msg,V_OD_buffer;


int main(int argc,char *argv[])
{
        // 1. allocate Environment handle and register version
        V_OD_erg=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);
        if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
        {
                printf("Error AllocHandle\n");
                exit(0);
        }
        V_OD_erg=SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
        if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
        {
                printf("Error SetEnv\n");
                SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
                exit(0);
        }
        // 2. allocate connection handle, set timeout
        V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);
        if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
        {
                printf("Error AllocHDB %d\n",V_OD_erg);
                SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
                exit(0);
        }
        SQLSetConnectAttr(V_OD_hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0);
        // 3. Connect to the datasource "web"
        V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "web", SQL_NTS,
                                     (SQLCHAR*) "christa", SQL_NTS,
                                     (SQLCHAR*) "", SQL_NTS);
        if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
        {
                printf("Error SQLConnect %d\n",V_OD_erg);
                SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1,
                              V_OD_stat, &V_OD_err,V_OD_msg,100,&V_OD_mlen);
                printf("%s (%d)\n",V_OD_msg,V_OD_err);
                SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
                exit(0);
        }
        printf("Connected !\n");
        V_OD_erg=SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);
        if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
        {
                printf("Fehler im AllocStatement %d\n",V_OD_erg);
                SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
                printf("%s (%d)\n",V_OD_msg,V_OD_err);
      SQLDisconnect(V_OD_hdbc);
      SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
                SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
                exit(0);
        }
    SQLBindCol(V_OD_hstmt,1,SQL_C_CHAR, &V_OD_buffer,150,&V_OD_err);
    SQLBindCol(V_OD_hstmt,2,SQL_C_ULONG,&V_OD_id,150,&V_OD_err);
       
    V_OD_erg=SQLExecDirect(V_OD_hstmt,"SELECT dtname,iduser FROM tkeyuser order by iduser",SQL_NTS);   
    if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
    {
       printf("Error in Select %d\n",V_OD_erg);
       SQLGetDiagRec(SQL_HANDLE_DBC, V_OD_hdbc,1, V_OD_stat,&V_OD_err,V_OD_msg,100,&V_OD_mlen);
       printf("%s (%d)\n",V_OD_msg,V_OD_err);
       SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
       SQLDisconnect(V_OD_hdbc);
       SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
       SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
       exit(0);
    }
    V_OD_erg=SQLNumResultCols(V_OD_hstmt,&V_OD_colanz);
    if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
    {
      SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
      SQLDisconnect(V_OD_hdbc);
      SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
      SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
      exit(0);
    }
    printf("Number of Columns %d\n",V_OD_colanz);
    V_OD_erg=SQLRowCount(V_OD_hstmt,&V_OD_rowanz);
    if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
    {
      printf("Number ofRowCount %d\n",V_OD_erg);
      SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
      SQLDisconnect(V_OD_hdbc);
      SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
      SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
      exit(0);
    }
    printf("Number of Rows %d\n",V_OD_rowanz);
    V_OD_erg=SQLFetch(V_OD_hstmt);
    while(V_OD_erg != SQL_NO_DATA)
    {
   printf("Result: %d %s\n",V_OD_id,V_OD_buffer);
   V_OD_erg=SQLFetch(V_OD_hstmt);
    };
    SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);
    SQLDisconnect(V_OD_hdbc);
    SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
    return(0);
}
页: [1]
查看完整版本: vc下c语言用ODBC连接数据库流程+示例