ODBC 连接未打开
ODBC connection not open
我最近将一些工作代码从我的笔记本电脑发送到我的桌面。尽管他们都使用相同的技术(Visual studio 社区 15 和 SQL 服务器 14),但我无法连接到桌面上的数据库。
我在两者上都有相同的 ODBC 驱动程序(并在我的桌面上尝试过各种组合)。在控制从 ODBC 到 SQL 服务器的连接时,它看起来很好,但是当我从调试器 运行 我的应用程序时,我收到此错误:
Message: [Microsoft][ODBC Driver Manager] Connection Not Open
SQLSTATE: 08003 Failed to connect
这是代码:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <sqltypes.h>
#include <sql.h>
#include <sqlext.h>
using namespace std;
void show_error(unsigned int handletype, const SQLHANDLE& handle)
{
SQLWCHAR sqlstate[1024];
SQLWCHAR message[1024];
if (SQL_SUCCESS == SQLGetDiagRec(handletype, handle, 1, sqlstate, NULL, message, 1024, NULL))
wcout << "Message: " << message << "\nSQLSTATE: " << sqlstate << endl;
}
int main() {
SQLHENV env;
SQLHDBC dbc;
SQLHSTMT stmt;
SQLRETURN ret;
SQLSMALLINT columns;
int row = 0;
/* Allocate an environment handle */
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
/* We want ODBC 3 support */
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
/* Allocate a connection handle */
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
/* Connect to the DSN */
SQLDriverConnectW(dbc, NULL, L"DRIVER={SQL Server};ERA-PC-STUART\JBK_DB;DATABASE=master;UID=geo;PWD=kalle123;", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);
/* Check for success */
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt))
{
show_error(SQL_HANDLE_DBC, dbc);
std::cout << "Failed to connect";
}
if (SQL_SUCCESS != SQLExecDirectW(stmt, L"select salary from dbo.salary_table", SQL_NTS)) {
show_error(SQL_HANDLE_STMT, stmt);
}
else {
int id;
cout << "ID:" << endl;
while (SQLFetch(stmt) == SQL_SUCCESS) {
SQLGetData(stmt, 1, SQL_C_ULONG, &id, 0, NULL);
cout << id << endl;
}
}
return 0;
}
如前所述,代码 运行 在我的笔记本电脑上完美无缺,但由于某种原因它无法在台式机上运行 - 即使 ODBC 已连接。
这可能是由于windows版本问题。您的笔记本电脑可能 运行 64 位 os,您的台式机可能 运行 32 位 os。使用32位odbc数据源管理器在桌面新建一个DSN试试again.There 代码没问题
对于将来可能遇到此问题的人;确保 TCP/IP 在您的 SQL 服务器配置管理器中启用。
在我的例子中,上面的内容被禁用并且连接字符串中缺少 "Server="。
我最近将一些工作代码从我的笔记本电脑发送到我的桌面。尽管他们都使用相同的技术(Visual studio 社区 15 和 SQL 服务器 14),但我无法连接到桌面上的数据库。
我在两者上都有相同的 ODBC 驱动程序(并在我的桌面上尝试过各种组合)。在控制从 ODBC 到 SQL 服务器的连接时,它看起来很好,但是当我从调试器 运行 我的应用程序时,我收到此错误:
Message: [Microsoft][ODBC Driver Manager] Connection Not Open
SQLSTATE: 08003 Failed to connect
这是代码:
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <sqltypes.h>
#include <sql.h>
#include <sqlext.h>
using namespace std;
void show_error(unsigned int handletype, const SQLHANDLE& handle)
{
SQLWCHAR sqlstate[1024];
SQLWCHAR message[1024];
if (SQL_SUCCESS == SQLGetDiagRec(handletype, handle, 1, sqlstate, NULL, message, 1024, NULL))
wcout << "Message: " << message << "\nSQLSTATE: " << sqlstate << endl;
}
int main() {
SQLHENV env;
SQLHDBC dbc;
SQLHSTMT stmt;
SQLRETURN ret;
SQLSMALLINT columns;
int row = 0;
/* Allocate an environment handle */
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
/* We want ODBC 3 support */
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
/* Allocate a connection handle */
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
/* Connect to the DSN */
SQLDriverConnectW(dbc, NULL, L"DRIVER={SQL Server};ERA-PC-STUART\JBK_DB;DATABASE=master;UID=geo;PWD=kalle123;", SQL_NTS, NULL, 0, NULL, SQL_DRIVER_COMPLETE);
/* Check for success */
if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt))
{
show_error(SQL_HANDLE_DBC, dbc);
std::cout << "Failed to connect";
}
if (SQL_SUCCESS != SQLExecDirectW(stmt, L"select salary from dbo.salary_table", SQL_NTS)) {
show_error(SQL_HANDLE_STMT, stmt);
}
else {
int id;
cout << "ID:" << endl;
while (SQLFetch(stmt) == SQL_SUCCESS) {
SQLGetData(stmt, 1, SQL_C_ULONG, &id, 0, NULL);
cout << id << endl;
}
}
return 0;
}
如前所述,代码 运行 在我的笔记本电脑上完美无缺,但由于某种原因它无法在台式机上运行 - 即使 ODBC 已连接。
这可能是由于windows版本问题。您的笔记本电脑可能 运行 64 位 os,您的台式机可能 运行 32 位 os。使用32位odbc数据源管理器在桌面新建一个DSN试试again.There 代码没问题
对于将来可能遇到此问题的人;确保 TCP/IP 在您的 SQL 服务器配置管理器中启用。
在我的例子中,上面的内容被禁用并且连接字符串中缺少 "Server="。