视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
C语言与SQL server连接
2025-09-29 02:32:20 责编:小OO
文档
搭建环境

Visual Studio 2008 + SQL Server 2008 + MSODBC(SQL Server 2008已经携带)

首先将SQL Server 2008安装好 并确保以开放1433端口。

检测方法: 打开cmd 输入命令netstat –an回车即可得到下图:

给予以上前提我们将SQL Server 的 SQL Server身份验证模式打开,确保能够使用用户sa身份登录数据库进行操作。(这很重要)

    打开的方法是找到SQL Server 配置管理器

    将SQL Server网络配置的两个协议中的Named Pipes协议和TCP/IP协议(一共四个)全部打开。(详细方法可在网上查到)

使用sa 身份登录数据库然后创建一个数据库命名为test,在建立一个test表(a varchar(200),b varchar(200))。

配置C语言环境

打开 Visual Studio 2008 新建项目选择 Visual C++ 下的Win32控制台应用程序设置成空项目,并输入以下代码:

#include    

#include    

#include    

#include    

#include    

#include    

#include    

#define MAXBUFLEN 255

SQLHENV henv = SQL_NULL_HENV;   

SQLHDBC hdbc1 = SQL_NULL_HDBC;   

SQLHSTMT hstmt1 = SQL_NULL_HSTMT;   

/*

    cpp文件功能说明:

    1.数据库操作中的添加,修改,删除,主要体现在SQL语句上a

    2.采用直接执行方式和参数预编译执行方式两种

*/

int main(){   

    RETCODE retcode;   

        //预编译SQL语句

    UCHAR    pre_sql[225] = "insert into test values(?,?)";

    SQLCHAR ConnStrIn[MAXBUFLEN] = "DRIVER={SQL Server}; SERVER=127.0.0.1;UID=sa; PWD=yangsonghe;Trusted_Connection=yes;DATABASE=test; ";

    //1.连接数据源

    //1.环境句柄

    retcode   =   SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE ,&henv); /*第二个参数原NULL*/ 

    retcode   =   SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);   

    //2.连接句柄 

    retcode   =   SQLAllocHandle(SQL_HANDLE_DBC,   henv,   &hdbc1);   

    retcode   =   SQLDriverConnect(hdbc1,NULL,ConnStrIn,SQL_NTS,NULL,NULL,NULL,SQL_DRIVER_NOPROMPT);      

    //判断连接是否成功

    if   (   (retcode   !=   SQL_SUCCESS)   &&   (retcode   !=   SQL_SUCCESS_WITH_INFO)   )   {     

        printf("连接失败!\\n");

    }   else   {   

        

1.分配一个语句句柄(statement handle)

        2.创建SQL语句

        3.执行语句

        4.销毁语句

        */

        retcode   =   SQLAllocHandle(SQL_HANDLE_STMT,   hdbc1,   &hstmt1);   

        //第一种方式

        //直接执行

        //添加操作

        //SQLExecDirect (hstmt1,sql,37);

        

        //第二种方式

        //绑定参数方式

        char a[200]="bbb";

        char b[200]="200";

        SQLINTEGER   p   =   SQL_NTS;

        //1预编译

        SQLPrepare(hstmt1,pre_sql,29); //第三个参数与数组大小相同,而不是数据库列相同

        //2绑定参数值

        SQLBindParameter(hstmt1,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&a,0,&p);

        SQLBindParameter(hstmt1,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&b,0,&p);

        //3 执行

        SQLExecute(hstmt1);

        

        printf("操作成功!");

        //释放语句句柄

        SQLCloseCursor (hstmt1);

        SQLFreeHandle (SQL_HANDLE_STMT, hstmt1);

    

    }   

    //3.断开数据库连接

    /*

     1. 断开数据库连接

     2.释放连接句柄.

     3.释放环境句柄(如果不再需要在这个环境中作更多连接)

    */

    SQLDisconnect(hdbc1);    

    SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);   

    SQLFreeHandle(SQL_HANDLE_ENV, henv);   

    return(0);   

}   

程序中主要还是使用了和MySQL与C语言连接时相同的函数,但SQLDriverConnect函数参数较多且重要,需要着重理解。

另外该程序的运行需要增加链接库文件odbc32.lib,odb32.lib

程序链接方法是#pragma comment (lib, "库文件名")。注意在头文件位置写,如果使用VC6 可以再setting->link里设置。

将以上步骤完成后编译运行即可得到如下结果:

以上方法是非数据源连接,我们还可以使用更简单的方法:

数据源连接。

    将test表建好以后,在运行里面输入odbc 打开ODBC数据源

点击系统DNS,添加数据源:

添加项选择SQL Server 名称为csql,服务器可以使用SQL Server 2008中显示的名称或者localhost或者127.0.0.1   描述可以不写

    选择双重身份验证并输入sa 密码。

    最后测试数据源,如果测试成功,说明数据源建立成功。我们可以进一步操作。

代码中被注释掉的部分:    

/*UCHAR    szDSN[SQL_MAX_DSN_LENGTH+1] = "csql",   

            szUID[MAXNAME] = "sa",   

            szAuthStr[MAXNAME] = "yangsonghe";*/  

即为数据源的连接方式。其代码原型如下:

#include    

#include    

#include    

#include    

#include    

#include    

#include    

SQLHENV henv = SQL_NULL_HENV;   

SQLHDBC hdbc1 = SQL_NULL_HDBC;   

SQLHSTMT hstmt1 = SQL_NULL_HSTMT;   

/*

    cpp文件功能说明:

    1.数据库操作中的添加,修改,删除,主要体现在SQL语句上

    2.采用直接执行方式和参数预编译执行方式两种

*/

int main(){   

    RETCODE retcode;   

    UCHAR    szDSN[SQL_MAX_DSN_LENGTH+1]   =   "csql",   

            szUID[MAXNAME]   =   "sa",   

            szAuthStr[MAXNAME]   =   "";  

    //SQL语句

        //直接SQL语句

    UCHAR    sql[37] = "insert into test values('aaa','100')";

        //预编译SQL语句

    UCHAR    pre_sql[29] = "insert into test values(?,?)";

    //1.连接数据源

        //1.环境句柄

    retcode   =   SQLAllocHandle   (SQL_HANDLE_ENV,   NULL,   &henv);   

    retcode   =   SQLSetEnvAttr(henv,   SQL_ATTR_ODBC_VERSION,   

                  (SQLPOINTER)SQL_OV_ODBC3,   

                  SQL_IS_INTEGER);   

        //2.连接句柄 

    retcode   =   SQLAllocHandle(SQL_HANDLE_DBC,   henv,   &hdbc1);   

    retcode   =   SQLConnect(hdbc1,   szDSN,   4,   szUID,   2,   szAuthStr,   0);    

    //判断连接是否成功

    if   (   (retcode   !=   SQL_SUCCESS)   &&   (retcode   !=   SQL_SUCCESS_WITH_INFO)   )   {     

        printf("连接失败!\\n");

    }   else   {   

        //2.创建并执行一条或多条SQL语句

        /*

        1.分配一个语句句柄(statement handle)

        2.创建SQL语句

        3.执行语句

        4.销毁语句

        */

        retcode   =   SQLAllocHandle(SQL_HANDLE_STMT,   hdbc1,   &hstmt1);   

        //第一种方式

        //直接执行

        //添加操作

        //SQLExecDirect (hstmt1,sql,37);

        

        //第二种方式

        //绑定参数方式

        char a[200]="bbb";

        char b[200]="200";

        SQLINTEGER   p   =   SQL_NTS;

        //1预编译

        SQLPrepare(hstmt1,pre_sql,29); //第三个参数与数组大小相同,而不是数据库列相同

        //2绑定参数值

        SQLBindParameter(hstmt1,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&a,0,&p);

        SQLBindParameter(hstmt1,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,200,0,&b,0,&p);

        //3 执行

        SQLExecute(hstmt1);

        

        printf("操作成功!");

        //释放语句句柄

        SQLCloseCursor (hstmt1);

        SQLFreeHandle (SQL_HANDLE_STMT, hstmt1);

    

    }   

    //3.断开数据源

    /*

     1.断开与数据源的连接.

     2.释放连接句柄.

     3.释放环境句柄(如果不再需要在这个环境中作更多连接)

    */

    SQLDisconnect(hdbc1);    

    SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);   

    SQLFreeHandle(SQL_HANDLE_ENV, henv);   

    return(0);   

}    

注意该程序与非数据源连接的改动并不大,实际上本人是根据该程序写出的非数据源连接方法。其使用的连接函数需要特别注意。该代码出处:

http://simpledev.iteye.com/blog/339537下载本文

显示全文
专题