这是我关于StackOverflow的第一个问题,请原谅!
这里是问题:我试图通过Windows上的ODBC以C ++的方式连接到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++
Connect to an ODBC Data Source (SQL Server Import and Export Wizard)