SQL Server-未找到数据源名称,也未指定默认驱动程序



我试图使用C++连接SQL server,但即使在添加DSN后也会出现错误"找不到数据源名称且未指定默认驱动程序"。我有一台win 10 64位机器,我在32位和64位的系统DSN下添加了同名的DSN。请帮我获取正确的连接字符串。

下面是我要做的。

#include <stdafx.h>
#include <windows.h>  
#include <sqlext.h>  
#include <iostream>
#include <locale>
#include <codecvt>
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))
{
std::wstring wMsg(message);
std::wstring wState(sqlstate);
//setup converter
using convert_type = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_type, wchar_t> converter;
//use converter (.to_bytes: wstr->str, .from_bytes: str->wstr)
std::string converted_msg = converter.to_bytes(wMsg);
std::string converted_state = converter.to_bytes(wState);

std::cout << "Message: " << converted_msg/*message*/ << "nSQLSTATE: " << converted_state/*sqlstate*/ << std::endl;
}
}
int main() {
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLRETURN retcode;
SQLWCHAR OutConnStr[255];
SQLSMALLINT OutConnStrLen;
HWND desktopHandle = GetDesktopWindow();   // desktop's window handle  
// Allocate environment handle  
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
// Set the ODBC version environment attribute  
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3, 0);
// Allocate connection handle  
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
// Set login timeout to 5 seconds  
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)50, 0);
SQLWCHAR retconstring[1024];
retcode = SQLDriverConnect(hdbc, NULL,
(SQLWCHAR*)"DRIVER={SQL1};Server=hostnameSQLEXPRESS;Database=master;Trusted_Connection=True;",
SQL_NTS, retconstring, 1024, NULL, SQL_DRIVER_NOPROMPT);
// Allocate statement handle  
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
// Process data  
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
SQLDisconnect(hdbc);
}
else
show_error(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
}
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
}

由于在连接字符串中指定了驱动程序而不是DSN,因此根本不需要创建DSN。只需指定一个有效的ODBC驱动程序,如建议的@user144098。

但是,SQL ServerODBC驱动程序是Windows附带的遗留驱动程序,仅用于与遗留应用程序的向后兼容性。使用现代驱动程序进行新的开发,这样您就可以使用更新的功能和TLS 1.2协议安全性。截至本文撰写之时,最新的SQL Server ODBC驱动程序是ODBC Driver 17 for SQL Server

安装驱动程序后,按如下方式更改连接字符串。我认为实例名称之前的反斜杠需要在字符串中转义,所以我将斜杠加倍。

"DRIVER={ODBC Driver 17 for SQL Server};Server=hostname\SQLEXPRESS;Database=master;Trusted_Connection=True;"