【问题标题】:Cannot make connection to SQL Server via ODBC无法通过 ODBC 连接到 SQL Server
【发布时间】:2019-12-06 03:44:00
【问题描述】:

以前我用ADO访问SQL Server,ADO连接对象的连接字符串是:

Provider=sqloledb;Data Source=MYPC;Integrated Security=SSPI;

其中 MYPC 是我的计算机名称,SQL Server 作为默认实例安装在我的计算机上。

上面的连接字符串效果很好。

但是,现在据说 ADO 已经过时了,微软又推荐了 ODBC(见https://blogs.msdn.microsoft.com/sqlnativeclient/2011/08/29/microsoft-is-aligning-with-odbc-for-native-relational-data-access/),所以我不得不修改我的代码来改用 ODBC。

所以我将与 SQL Server 的连接更改为以下代码:

    CDatabase Database;

    //  Provider=sqloledb;Data Source=MYPC;Integrated Security=SSPI;
    Database.OpenEx(_T("Driver = {SQL Native Client}; Server = MYPC; Trusted_Connection = yes;"), CDatabase::noOdbcDialog);

    Database.ExecuteSQL(_T("create database [MyDB2019] on primary (name=[MyDB2019_File],filename='F:\\MyDB2019.mdf')"));

    Database.Close();

但是,此代码不起作用。执行Database.OpenEx后会出现CDBException提示

未找到数据源名称且未指定默认驱动程序。

为什么?

注意:我使用的是 Visual C++ 2008 和 ADO

【问题讨论】:

  • “现在说ADO已经过时,MS又推荐ODBC”——你有这句话的参考吗?
  • 我也打算这么说。 ODBC 的特定 sql 要求与本机 sql server 不同,因此您可能需要的不仅仅是更改连接。
  • 这是一个非常古老的参考,从那时起,我们作为一个社区就一直在努力!第一行写着EDIT (3/30/2018): OLE DB is now undeprecated.
  • @TomC,这是否意味着我们可以继续使用 OLE DB?

标签: c++ sql-server connection odbc ado


【解决方案1】:

错误/异常指向问题(虽然一开始看起来有点笼统)。

“未找到数据源名称且未指定默认驱动程序”

找不到数据源名称 --> 你没有指定 DSN,你没有 想用DSN,忽略这部分

.

并且未指定默认驱动程序 --> 您打算使用驱动程序,因此这部分错误很可能适用于您。

连接字符串在语法上看起来是正确的:“Driver={Driver Name}...”,所以下一个 步骤是检查您尝试使用的名为 SQL Native Client 的驱动程序是否存在 在你的机器上。

“SQL Native Client”是/现在是 SQL Server 2005 的驱动程序名称。 从 SQL2008 驱动程序 name 获得了 版本描述符

Driver={SQL Native Client}             ,sql2005   
Driver={SQL Server Native Client 10.0} ,sql2008  
Driver={SQL Server Native Client 11.0} ,sql2012 and later  
Driver={ODBC Driver 11 for SQL Server} ,sql2012 and later, odbc appears in the name
Driver={ODBC Driver 13 for SQL Server}  
Driver={ODBC Driver 17 for SQL Server}

在您的计算机上查找已安装的“SQL Native”和“ODBC Driver for SQL Server”驱动程序的一种简单方法是运行 ODBC 数据源管理器。在搜索框中键入 Odbc 数据源或在命令/地址栏中键入 odbcad32.exe(对于 64 位:%windir%\system32\odbcad32.exe)

在 ODBC 数据源管理器中,切换到“驱动程序”选项卡,您将在那里找到所有可用/已安装的驱动程序,供您使用。

这是一个使用 odbc 打开与 localhost 的连接的 powershell 脚本。根据您安装的驱动程序进行相应调整

cls
$conn = new-object system.data.odbc.odbcconnection 
$conn.connectionstring = 
# all these installed on my pc and working
#"Driver={SQL Server Native Client 11.0};Server=localhost; Database=master;Trusted_Connection=yes;" 
#"Driver={SQL Server};Server=localhost; Database=master;Trusted_Connection=yes;" 
#"Driver={ODBC Driver 11 for SQL Server};Server=localhost; Database=master;Trusted_Connection=yes;" 
"Driver={ODBC Driver 17 for SQL Server};Server=localhost; Database=master;Trusted_Connection=yes;" 

$conn.Open()
$conn.State
$conn.Close();

..还有一个 mfc 按钮

void CMFCDBTestDlg::OnBnClickedButton1()
{
    // TODO: Add your control notification handler code here
    CDatabase database;
    CString connectionstring = _T("Driver={SQL Server Native Client 10.0};Server=localhost;Trusted_Connection=yes;");
    CString messagetext;

    TRY{
        //database.Open(NULL, FALSE, FALSE, connectionstring, FALSE); //ok
        database.OpenEx(connectionstring, CDatabase::noOdbcDialog); //ok

        if (database.IsOpen()){
            messagetext = _T("open, database:") + database.GetDatabaseName();
            database.Close();
        }
   }CATCH(CDBException, e) {
       messagetext = _T("Database error: ")+e->m_strError;
   }
   END_CATCH;

   AfxMessageBox(messagetext, 0, 0);
}

【讨论】:

  • 抱歉,我尝试将驱动程序更改为 {SQL Server Native Client 10.0} 但仍然出现相同的异常。
  • 我是否总是需要指定数据库部分?我只想建立一个连接,但一开始不打开或创建任何数据库。
  • 您需要检查您机器上已安装的 odbc 驱动程序。我已经使用 Open() 和 OpenEx() 尝试了两个较旧的 Native Clients 10&11,它们运行良好。您不必在连接字符串中显式定义数据库,在这种情况下使用登录的默认数据库(默认情况下它是主数据库)。目前尚不清楚您如何定义“建立连接”。当您调用 OpenEx() 时,您正在主动建立/建立与 sql server 的连接。连接永远不会处于“空白”状态,它总是“最终”连接到数据库。
【解决方案2】:

创建一个带有 udl 扩展名的文件。示例:test.udl 双击文件。使用 GUI 连接到您的数据库。完成后,使用记事本打开 UDL 文件并提取连接字符串。

https://www.dmxzone.com/go/312/how-to-generate-an-ado-connection-string/

【讨论】:

  • 有没有办法在不创建文件的情况下建立连接?你的方法有点不方便。
  • 嗯,这只是一种自动获取连接字符串的方法。使用记事本打开文件,即可将连接字符串粘贴到代码中。
【解决方案3】:

问题来自连接字符串中的多余空格,删除多余空格后:

"驱动程序 = {SQL Native Client};服务器 = MYPC;Trusted_Connection = 是;"

到(以及更改驱动程序名称):

"Driver={SQL Server Native Client 10.0};Server=MYPC;Trusted_Connection=yes;"

连接会成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2016-09-29
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多