【发布时间】:2020-12-31 00:03:06
【问题描述】:
我正在尝试从 C++ 中的 Visual Studio 2017 连接到我在 SQL Server Management Studio 中创建的数据库,但函数 SQLDriverConnect 没有连接,它失败并由于某种原因返回 SQL_ERROR。
这是我正在使用的代码:(我从互联网上获取的,我在许多其他网站上看到过)
#include <iostream>
#include <windows.h>
#include <sqlext.h>
#include <sqltypes.h>
#include <sql.h>
using namespace std;
void showSQLError(unsigned int handleType, const SQLHANDLE& handle)
{
SQLCHAR SQLState[1024];
SQLCHAR message[1024];
if (SQL_SUCCESS == SQLGetDiagRec(handleType, handle, 1, SQLState, NULL, message, 1024, NULL))
cout << "SQL driver message: " << message << "\nSQL state: " << SQLState << "." << endl;
}
int main()
{
SQLHANDLE SQLEnvHandle = NULL;
SQLHANDLE SQLConnectionHandle = NULL;
SQLHANDLE SQLStatementHandle = NULL;
SQLRETURN retCode = 0;
do {
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &SQLEnvHandle))
break;
if (SQL_SUCCESS != SQLSetEnvAttr(SQLEnvHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0))
break;
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_DBC, SQLEnvHandle, &SQLConnectionHandle))
break;
if (SQL_SUCCESS != SQLSetConnectAttr(SQLConnectionHandle, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0))
break;
SQLCHAR retConString[1024];
switch (SQLDriverConnect(SQLConnectionHandle, NULL, (SQLCHAR*)"DRIVER={SQL Server}; SERVER=DESKTOP-MYSERVER\\SQLEXPRESS, 1433; DATABASE=mydatabase; UID=sa; PWD=mypassword;", SQL_NTS, retConString, 1024, NULL, SQL_DRIVER_NOPROMPT)) {
case SQL_SUCCESS:
std::cout << "YES" << std::endl;
break;
case SQL_SUCCESS_WITH_INFO:
std::cout << "YES" << std::endl;
break;
case SQL_NO_DATA_FOUND:
showSQLError(SQL_HANDLE_DBC, SQLConnectionHandle);
retCode = -1;
break;
case SQL_INVALID_HANDLE:
showSQLError(SQL_HANDLE_DBC, SQLConnectionHandle);
retCode = -1;
break;
case SQL_ERROR:
cout << "Here" << endl; // it is failing here <<<<<<
showSQLError(SQL_HANDLE_DBC, SQLConnectionHandle);
retCode = -1;
break;
default:
break;
}
if (retCode == -1)
break;
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT, SQLConnectionHandle, &SQLStatementHandle))
break;
//Some sql query execution after connecting to the database.
} while (FALSE);
SQLFreeHandle(SQL_HANDLE_STMT, SQLStatementHandle);
SQLDisconnect(SQLConnectionHandle);
SQLFreeHandle(SQL_HANDLE_DBC, SQLConnectionHandle);
SQLFreeHandle(SQL_HANDLE_ENV, SQLEnvHandle);
getchar();
}
我已经尝试了互联网上建议的所有可能的解决方案,例如以管理员身份运行 VS,将 Trusted_Connection=yes; 代替 UID/PWD,将 localhost 放入 SERVER 或有人建议我应该启用 TCP/IP 和命名管道在 SQL Server 配置和服务中的 SQL Server Browser 中。
但是这些都不起作用,我已将我的数据库与sa 用户名添加到 ODBC DSN 用户和 DSN 系统,也没有运气。
这就是我在控制台中得到的:
我错过了什么吗?怎么回事?
提前致谢
【问题讨论】:
-
那么,您看到的错误消息有什么不明白的地方?您是否检查过服务器存在并且您可以使用不同的控制台程序访问它?
-
@πάνταῥεῖ 我已尝试搜索该错误,以查看解决方案以及有关如何检查它是否存在的建议,但实际上没有任何帮助。我也可以通过 PHP 连接访问数据库(例如网站和 php 函数,这是有效的),但在 VS 中它不是(C++)
-
所以这就是服务器存在的证明,然后必须对访问权限做一些事情。这就是为什么我建议您可以尝试使用另一个控制台客户端来连接该服务器。
-
显然我必须在 SQL 服务器配置中启用 TCP/IP 并添加端口 1433(那里的属性中的端口字段为空...)
-
如果您解决了问题,请随时按照以下详细步骤编写您自己的答案。也许它可以帮助其他访问这里的人。
标签: c++ sql c visual-studio odbc