ODBC 应用编程

转载 2011年01月18日 11:25:00

转自:http://www.phpfans.net/article/htmls/201008/Mjk1NzY1.html

 

 最近,需要在Linux平台上连接SQL Server,在网上找到了unixODBC,对官方网站上的资料作了整理,以作系统掌握。

<!--[if !supportLists]-->

1.       <!--[endif]-->连接数据源

步骤:

<!--[if !supportLists]-->(1)       <!--[endif]-->分配ODBC环境句柄,设置句柄属性(设置ODBC版本)

<!--[if !supportLists]-->(2)       <!--[endif]-->分配连接句柄,设置连接属性(可以使用默认属性)

<!--[if !supportLists]-->(3)       <!--[endif]-->连接数据源

 

涉及的API定义:

句柄——SQLHENVSQLHDBC

句柄类型——SQL_HANDLE_ENVSQL_HANDLE_DBC

属性类型——SQL_ATTR_ODBC_VERSION

属性值——SQL_OV_ODBC3

指示符——SQL_NULL_HANDLESQL_NTS

返回值——SQL_SUCCESS SQL_SUCCESS_WITH_INFOSQL_ERROR

         SQL_INVALID_HANDLE

API函数:

     SQLAllocHandleSQLSetEnvAttrSQLSetConnectAttrSQLConnect
   
sample code

SQLHENV             V_OD_Env; // Handle ODBC environment

long             V_OD_erg; // result of functions

SQLHDBC             V_OD_hdbc; // Handle connection


char             V_OD_stat[10]; // Status SQL

SQLINTEGER         V_OD_err,V_OD_rowanz,V_OD_id;
SQLSMALLINT         V_OD_mlen;
char V_OD_msg[200],V_OD_buffer[200];

    // 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_DBC, V_OD_hdbc);
        SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);
        exit(0);
    }
    printf("Connected !/n");

 

2. 查询数据库
步骤:

  1)分配查询句柄

2)根据查询字段类型,绑定表列到变量

3)执行查询

4)取出结果

 

涉及API定义:(之前出现的不再列出)

ODBC句柄——SQLHSTMT

句柄类型——SQL_HANDLE_STMT

数据类型——charSQLINTEGERSQLSMALLINT

指示符——SQL_C_CHARSQL_C_ULONG

      返回值——SQL_NO_DATA

接口函数:

     SQLBindColSQLExecDirectSQLNumResultColsSQLRowCountSQLFetch

sample code

SQLHSTMT V_OD_hstmt; // Handle for a statement

SQLINTEGER V_OD_err,V_OD_id;
char V_OD_buffer[200];
SQLBindCol(V_OD_hstmt,1,SQL_C_CHAR, &V_OD_buffer,200,&V_OD_err);
SQLBindCol(V_OD_hstmt,2,SQL_C_ULONG,&V_OD_id,sizeof(V_OD_id),&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 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);
    }

 


3. 关闭连接

 步骤:

1)关闭连接

2)释放句柄

 

涉及API接口:

    SQLDisconnect

    SQLFreeHandle

sample code


     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);


4. 完整样例代码

/* 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[10];        // Status SQL

SQLINTEGER         V_OD_err,V_OD_rowanz,V_OD_id;
SQLSMALLINT         V_OD_mlen,V_OD_colanz;
char V_OD_msg[200],V_OD_buffer[200];


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);
}

c语言数据库编程--ODBC

c语言数据库编程 转载自:http://www.cnblogs.com/nliao/archive/2010/09/09/1822660.html   最近我的导师要求我用c语言读出acces...

VS2013 MFC ODBC连接SQL SERVER数据库编程(三)

VS2013 MFC ODBC连接SQL SERVER数据库编程(三) ODBC Crecordset的操作 数据库sql server的增删查改等操作...
  • my_acm
  • my_acm
  • 2014年12月18日 17:43
  • 4064

ODBC 数据库编程(VC)

kzangv learn&think 博问闪存新随笔管理 随笔- 38  文章- 81  评论- 25  ODBC 数据库编程(VC) ...

VS2013 MFC ODBC连接SQL SERVER数据库编程(一)

VS2013 MFC ODBC连接SQL SERVER数据库编程(一) 转载请注明出处:http://blog.csdn.net/my_acm/article/category/2616577 1、...
  • my_acm
  • my_acm
  • 2014年12月12日 23:49
  • 8638

使用C语言连接 ms sql server 2008 —— ODBC 编程

ODBC连接分为两个步骤: 1.配置本地ODBC环境 2.代码. 一.配置本地ODBC环境 1.启动 sql server 服务. 运行->net start mssqlserver  2.更...

MFC ODBC数据操作编程

为了简化开发人员编写数据库应用程序,VC++的在其基础类库(MFC)里对ODBC API进行了封装,实现了一个面向对象的数据库编程接口,使VC++的数据库变得更加容易。 本章首先对MFC ODBC的...

Linux/Unix下ODBC的安装、配置与编程

ODBC原理 ODBC 是Open Database Connect 即开放数据库互连的简称,它是由Microsoft 公司于1991 年提出的一个用于访问数据库的统一界面标准,是应用程序和数据库系...

在C++中的ODBC API数据库编程

一、动态加载数据源 1、通过修改注册表加载数据源: ·用户数据源:HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI ·系统数据源:HKEY_LOCAL_M...

举例介绍VC++中的ODBC编程

ODBC(怒放式数据库Databnse连接)是一种应用SQL的程式设计接口,应用ODBC使数据库Databnse实际运用程式的编写者避免了与数据源相连接的复杂性。利用ODBC技能使得程式员从具体的DB...

[Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配

[Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配 http://zhidao.baidu.com/link?url=Vv1kz...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ODBC 应用编程
举报原因:
原因补充:

(最多只允许输入30个字)