通过 C++ 中的 ODBC 连接到 Azure SQL 数据库时出现问题

Issue in connecting via ODBC in C++ to Azure SQL database

这是我在 Whosebug 上的第一个问题,所以请原谅我的天真!

问题是:我正在尝试通过 C++ 中 Windows 上的 ODBC 连接到 Azure SQL 数据库,但没有成功,因为我不断收到以下消息:

[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0)

我从 Azure 检索了连接字符串并确保我的 IP 地址已在防火墙设置中注册。

按照 Microsoft 提供的示例,我通过以下方式连接:

    _retcode = SQLDriverConnect(
        _hDbc,
        NULL,
        ( SQLCHAR * ) connectionString,
        SQL_NTS,
        NULL,
        0,
        NULL,
        SQL_DRIVER_NOPROMPT );

其中 connectionString 定义为:

const char * connectionString = "Driver = { ODBC Driver 13 for SQL Server };"
    "Server = tcp:<datasource>.database.windows.net, 1433;"
    "Database = <database>;"
    "Uid = <account>; Pwd = <password>;"
    "Encrypt = yes; TrustServerCertificate = no; Connection Timeout = 30;";

此外,我尝试在 C# 中通过 .NET 进行连接,它适用于以下连接字符串构建:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
    builder.DataSource = "<datasource>.database.windows.net";
    builder.UserID = "<account>";
    builder.Password = "<password>";
    builder.InitialCatalog = "<datavase>";

我能够执行 "SELECT @@VERSION" 语句并得到以下结果:

Microsoft SQL Azure (RTM) - 12.0.2000.8
    Feb 26 2020 10:26:43
    Copyright (C) 2019 Microsoft Corporation

那我做错了什么???

提前感谢您的帮助!

我找到了解决办法! 首先,我提供了 OutConnectionString 信息以显示工作连接字符串(如果有)。

       SQLDriverConnect(hDbc,
                     GetDesktopWindow(),
                     pwszConnStr,
                     (SQLSMALLINT)wcslen(pwszConnStr),
                     OutConnectionString,
                     BufferLength,
                     &StringLength2Ptr,
                     SQL_DRIVER_COMPLETE));

然后,我恢复使用在未提供命令参数时启动的向导创建 DSN 文件(在 Microsoft 示例中)。

我设法提供了正确的参数并能够连接到我的 Azure SQL 数据库。

我打印了 OutConnectionString,这是结果(与我的预期相去甚远):

const char * connectionString = "DRIVER=ODBC Driver 17 for SQL Server;SERVER=<server>.database.windows.net;UID=<account>;PWD=<password>;Trusted_Connection=No;DATABASE=<database>;";

然后我将上面的字符串直接插入到我的代码中,这次没有提示:

    _retcode = SQLDriverConnect(
    _hDbc,
    NULL,
    ( SQLCHAR * ) connectionString,
    strlen( connectionString ),
    NULL,
    0,
    NULL,
    SQL_DRIVER_NOPROMPT );

它正在运行!

作为参考,这里是 Microsoft 官方文档的链接:

Connect to SQL Database using C and C++

SQLDriverConnect Function

Connect to an ODBC Data Source (SQL Server Import and Export Wizard)

Windows with C++ : Using Databases on Windows Azure