【问题标题】:How to connect with SQLConnect from ODBC?如何从 ODBC 连接 SQLConnect?
【发布时间】:2020-06-21 08:48:28
【问题描述】:

我正在尝试使用 ODBC 和 C++ 连接到 SQL Server,但它无法连接我不知道为什么。 DSN 是 已在用户 DSN 列表中设置。

  • Windows 10 64 位
  • 编译器:VC++ 2010
  • ODBC 版本:2017.175.02.01
  • SQL Server 2019
# include "stdafx.h"
# include <windows.h>
# include <stdio.h>
# include <stdlib.h>
# include <sql.h>
# include <sqlext.h>
# include <iostream>
 
int main( )
{
    HENV henv;
    HDBC hdbc;
    RETCODE rc;
    
    SQLAllocEnv(&henv);
    SQLAllocConnect(henv, &hdbc);
 
    /* Connect to the database using the ODBC DSN definition. */
    rc = SQLConnect( hdbc,     /* Connection handle */
        (SQLWCHAR*)"db1",      /* The ODBC DSN definition */
        SQL_NTS,               /* This is a null-terminated string */
        NULL,                  /* No username required */
        0,                     /* This is a null-terminated string */
        NULL,                  /* No password required */
        0);                    /* This is a null-terminated string */

    if ((rc != SQL_SUCCESS) && (rc != SQL_SUCCESS_WITH_INFO))
    {
        SQLFreeConnect(hdbc);
        SQLFreeEnv(henv);
        std::cout << "FAIL\n";
    }
    else{
        SQLFreeConnect(hdbc);
        SQLFreeEnv(henv);
        std::cout << "YEA! \n";
    }

    /* Exit this program. */
    system("pause");
    return( 0 );
}

解决方案: 需要先声明变量类型并设置其值,然后再将其提供给 SQLConnect。 感谢 PaulMcKenzie。


    SQLWCHAR name [] = L"db1";
    
    rc = SQLConnect( hdbc,     /* Connection handle */
        name,                  /* The ODBC DSN definition */
        SQL_NTS,               /* This is a null-terminated string */
        NULL,                  /* No username required */
        0,                     /* This is a null-terminated string */
        NULL,                  /* No password required */
        0);                    /* This is a null-terminated string */

【问题讨论】:

  • 您应该调用SQLGetDiagRec 来获取错误。此外,(SQLWCHAR*)"db1" 看起来是错误的,因为您似乎正在尝试将窄字符串“转换”为宽字符串,并且强制转换不会转换。如果你删除了 SQLWCHAR* 演员表,编译器会给你什么错误?
  • @PaulMcKenzie 无法将参数 2 从 'const char [4]' 转换为 'SQLWCHAR *'
  • 嗯,也许这就是它无法连接的原因。你给函数一个虚假的字符串。该函数需要一个宽字符串,所以给它一个:L"db1",不进行强制转换,或者SQLWCHAR name [] = L"db1";然后给出函数name.
  • 基本上,从不强制转换字符类型——这样做表明事情会出错。使用函数需要的字符类型,而不进行任何强制转换。
  • @PaulMcKenzie omg SQLWCHAR 名称 [] = L"db1";成功了,谢谢

标签: c++ sql-server odbc


【解决方案1】:

这不会像你想象的那样做:

(SQLWCHAR*)"db1",

如果SQLWCHAR* 是指向宽字符的指针,则转换非宽字符串文字不会产生所需的结果,因为转换不会神奇地将非宽字符串文字转换为宽字符串。由于"db1" 字符串在函数接收到字符串时以某种方式不正确,因此 ODBC 函数失败。


处理这个问题的正确方法是首先让代码在没有任何字符串类型到字符串类型转换的情况下进行编译。强制转换字符串类型是可能出现问题的标志。使用函数需要的字符串类型。

这适用于任何应用程序——如果你正在转换字符串类型,你最好确切地知道你在做什么,因为你可能会通过发出 C 风格的转换来抑制编译器错误来规避 C++ 的类型安全。

在这种情况下,字符串类型是SQLWCHAR,因此可以创建一个字符串(在这种情况下,可以修改,因为它不是const 指针):

SQLWCHAR name [] = L"db1";

然后该函数将不需要对第二个参数进行强制转换:

rc = SQLConnect( hdbc,     /* Connection handle */
    name,                  /* The ODBC DSN definition */
    SQL_NTS,               /* This is a null-terminated string */
    NULL,                  /* No username required */
    0,                     /* This is a null-terminated string */
    NULL,                  /* No password required */
    0);          

【讨论】:

    猜你喜欢
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多