c++ - 在 C++ 中通过 ODBC 连接到 Azure SQL 数据库时出现问题
问题描述
这是我在 StackOverflow 上的第一个问题,请原谅我的无辜!
这是问题所在:我正在尝试通过 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 );
它正在工作!
作为参考,这里是微软官方文档的链接:
推荐阅读
- swiftui - SwiftUI 和 AVPlayer
- java - DDD 中与聚合相关的低争用事务如何?
- javascript - 时刻自定义日期格式不起作用
- vue.js - 更改 Bootstrap Vue 折叠导航栏图标的颜色
- haskell - 2 个列表的串联
- html - 如何将文本框放在图像旁边
- c# - 如何防止页面加载时故事板自动播放?
- forms - 更新控制器方法不在 Laravel 中呈现 json 数据
- javascript - 加载屏幕并做出反应以改善用户体验
- javascript - 如何使 HTML 元素在悬停时展开并在同一个 flex 容器中覆盖相似的相邻元素而不移动它们?