【发布时间】: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