过去,我使用ADO访问SQL Server,ADO连接对象的连接字符串为:
Provider=sqloledb;Data Source=MYPC;Integrated Security=SSPI;
其中MYPC是我的计算机的名称,而SQL Server作为默认实例安装在我的计算机上。
上面的连接字符串效果很好。
但是,现在据说ADO已过时,Microsoft再次推荐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
答案 0 :(得分:1)
错误/异常说明了问题所在(尽管乍一看似乎有点通用)。
“未找到数据源名称,也未指定默认驱动程序”
找不到数据源名称->您未指定DSN,但未指定 要使用DSN,请忽略此部分
。
并且未指定默认驱动程序->您打算使用驱动程序,因此这部分错误很可能适用于您。
语法上正确显示连接字符串:“ Driver = { Driver Name } ...”,因此下一个 步骤是检查您尝试使用的名为SQL Native Client的驱动程序是否存在 在您的计算机上。
“ SQL Native Client”是SQL Server 2005的驱动程序名称。 在SQL2008中,驱动程序名称获得了版本描述符。
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”和“ SQL Server ODBC驱动程序”驱动程序的简单方法是运行ODBC数据源管理器。在搜索框中输入Odbc数据源,或在命令/地址栏中输入odbcad32.exe(对于64位:%windir%\ system32 \ odbcad32.exe)
在ODBC数据源管理器中,切换到“驱动程序”选项卡,您将在这里找到所有可用的/已安装的驱动程序。
这是一个Powershell脚本,可使用odbc打开与localhost的连接。根据安装的驱动程序进行相应调整
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);
}
答案 1 :(得分:0)
创建带有udl扩展名的文件。示例:test.udl 双击文件。使用GUI连接到数据库。完成后,使用记事本打开UDL文件并提取连接字符串。
请参见https://www.dmxzone.com/go/312/how-to-generate-an-ado-connection-string/
答案 2 :(得分:0)
问题出在以下地方,因为连接字符串中的多余空格:
“驱动程序= {SQL Native Client};服务器= MYPC; Trusted_Connection =是;”
到(并更改驱动程序名称):
“ Driver = {SQL Server Native Client 10.0}; Server = MYPC; Trusted_Connection =是;”
连接将成功。