再见理想544 2023-11-20 02:56 采纳率: 100%
浏览 30
已结题

c语言连接sql server总是失败

所用的平台是vc6.0,vs2010,sqlsever2012.
找了一晚上代码改来改去就是无法连接成功,电脑系统是win7的。希望哪位好兄弟,好姐妹能帮帮我一把。不弄出来真的很难受,像吃了屎一样。

后面自己打断点测试,发现SQLconnect函数的返回值总是SQL_ERROR.数据源名称,账号密码都没有问题。

  • 写回答

10条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-11-20 02:56
    关注

    引自强大而免费的微信小程序:皆我百晓生

    连接SQL Server主要涉及以下几个方面:配置ODBC数据源、连接数据库、执行SQL语句。

    1. 配置ODBC数据源

    首先确保已经正确配置了ODBC数据源。在控制面板中找到“ODBC数据源”(32位或64位),点击“系统DSN”选项卡,然后点击“添加”按钮,选择“SQL Server”驱动,按照提示填写SQL Server的相关信息。

    2. 连接数据库

    在代码中,可以通过以下步骤来连接数据库:

    • 使用SQLAllocHandle函数申请环境句柄(henv)。
    • 使用SQLSetEnvAttr函数设置环境句柄属性,其中SQL_ATTR_ODBC_VERSION属性用于指定ODBC版本。
    • 使用SQLAllocHandle函数申请数据库连接句柄(hdbc)。
    • 使用SQLConnect函数连接数据库,其中参数依次为数据源名称、用户名、密码。
    • 判断连接是否成功,可以根据返回值(ret)的结果来判断,如果ret等于SQL_SUCCESS或SQL_SUCCESS_WITH_INFO则表示连接成功,否则表示连接失败。

    这是你提供的代码中的一部分,稍作修改:

    SQLRETURN ret;
    SQLHENV henv;
    SQLHDBC hdbc;
    SQLHSTMT hstmt;
    
    ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv); //申请环境句柄
    ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
    ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); //申请数据库连接句柄
    
    ret = SQLConnect(hdbc, (SQLCHAR*)"data_test", SQL_NTS, (SQLCHAR*)"sa", SQL_NTS, (SQLCHAR*)"12345678", SQL_NTS);
    /*data_test为配置的ODBC数据源名称,这里根据自己的配置进行修改*/
    
    if (!(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO))
    {
        printf("连接数据库失败!\n");
        return -1;
    }
    
    // 连接成功后可以执行后续操作
    

    3. 执行SQL语句

    连接成功后,可以使用SQLExecDirect函数来执行SQL语句。在执行查询语句后,可以使用SQLGetData函数来获取查询结果。需要注意的是,SQLGetData函数需要传入几个参数,如列号、数据类型、目标缓冲区等,可以根据需要进行调整。

    这是你提供的代码中的一部分,稍作修改:

    ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
    
    SQLCHAR sql1[] = "use stu_info";
    SQLCHAR sql2[] = "select * from student";
    ret = SQLExecDirect(hstmt, sql1, SQL_NTS);
    ret = SQLExecDirect(hstmt, sql2, SQL_NTS);
    
    if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
    {
        SQLCHAR str1[50], str2[50], str3[50], str4[50], str5[50], str6[50];
        SQLINTEGER len_str1, len_str2, len_str3, len_str4, len_str5, len_str6;
        
        while (SQLFetch(hstmt) != SQL_NO_DATA)
        {
            SQLGetData(hstmt, 1, SQL_C_CHAR, str1, 50, &len_str1);   //获取第一列数据
            SQLGetData(hstmt, 2, SQL_C_CHAR, str2, 50, &len_str2);
            SQLGetData(hstmt, 3, SQL_C_CHAR, str3, 50, &len_str3);
            SQLGetData(hstmt, 4, SQL_C_CHAR, str4, 50, &len_str4);
            SQLGetData(hstmt, 5, SQL_C_CHAR, str5, 50, &len_str5);
            SQLGetData(hstmt, 6, SQL_C_CHAR, str6, 50, &len_str6);
            
            printf("%s\t%s\t%s\t%s\t%s\t%s\n", str1, str2, str3, str4, str5, str6);
        }
    }
    
    // 执行完毕后记得释放连接句柄和环境句柄
    

    请根据以上步骤对你的代码进行相应修改,重点关注连接数据库的部分,确保数据源名称、用户名、密码等信息正确无误。如果还是无法连接成功,请尝试使用其他工具(如SQL Server Management Studio)来连接数据库,以确定问题是由代码还是配置引起的。


    你可以在上述代码的基础上添加一个查询表的语句来检测是否能成功对 SQL Server 进行操作。以下是示例代码:

    ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
    
    SQLCHAR sql[] = "SELECT * FROM your_table_name"; // 将 your_table_name 替换为你要查询的表名
    ret = SQLExecDirect(hstmt, sql, SQL_NTS);
    
    if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
    {
        SQLCHAR column1[50], column2[50], column3[50];
        SQLINTEGER len_column1, len_column2, len_column3;
    
        while (SQLFetch(hstmt) != SQL_NO_DATA)
        {
            SQLGetData(hstmt, 1, SQL_C_CHAR, column1, 50, &len_column1);   // 获取第一列数据
            SQLGetData(hstmt, 2, SQL_C_CHAR, column2, 50, &len_column2);
            SQLGetData(hstmt, 3, SQL_C_CHAR, column3, 50, &len_column3);
            
            printf("%s\t%s\t%s\n", column1, column2, column3);
        }
    }
    
    // 执行完毕后记得释放连接句柄和环境句柄
    

    你只需将代码中的 your_table_name 替换为你要查询的表名,然后运行程序即可查看表中的数据。如果能正常输出数据,则说明连接到 SQL Server 并成功进行了查询操作。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏
查看更多回答(9条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月21日
  • 已采纳回答 11月21日
  • 修改了问题 11月20日
  • 创建了问题 11月20日

悬赏问题

  • ¥20 用c++完成两道大题,要求提供.h和.cpp,以及用来测试的main.cpp
  • ¥15 2024电赛H题指导
  • ¥15 第三方如何控制E8a进行烧录
  • ¥15 关于lua调用DLL的c/c++动态库(相关搜索:数据库)
  • ¥15 openwrt结合智能家居(相关搜索:路由器)
  • ¥15 求一款免费的pdf编辑js,web端用的
  • ¥15 求分析下图晶体与三极管组成的振荡电路
  • ¥100 多线程+连接池+代理 运行一段时间线程阻塞
  • ¥15 关于#单片机#的问题:求一个使用C语言将重力加速度gx,gy,gz积分获取到速度的代码(相关搜索:c语言)
  • ¥15 matlab导致电脑重启问题