我试图用ODBC和C++连接到Server,但它无法连接,我不知道为什么。DSN已在用户DSN列表中设置。
2017.175.02.01
# 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 */发布于 2020-06-21 00:48:28
这不能像你想的那样做:
(SQLWCHAR*)"db1",
如果SQLWCHAR*是一个指向宽字符的指针,那么转换一个非宽字符串将不会产生所需的结果,因为强制转换不会神奇地将非宽字符串文字转换为宽字符串。ODBC函数失败是由于"db1"字符串在接收到该字符串时以某种方式导致不正确。
处理这个问题的正确方法是首先让代码编译,而不需要任何字符串类型到字符串类型的强制转换。转换字符串类型是可能出错的迹象。使用函数所需的字符串类型。
这适用于任何应用程序--如果你正在转换字符串类型,你最好确切地知道你在做什么,因为你可能是在规避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); https://stackoverflow.com/questions/62491255
复制相似问题