小弟真的快被他弄疯了,也许自己知识不够全面吧,现把疑点与大家讨论一下,也许自己水平有限,希望各位多多指点:疑点一:在dll里面用ado 连接sqlserver, 连接信息没有错,但是就是不能与数据库建立连接,而奇怪的就是,用相同的代码,用access的连接信息却可以很正常的连接access数据库。疑点二:还是用相同的代码,在mfc exe application下面连接sqlserver就可以很正常的连接数据库,用access连接也可以//////////////////////////调试2///////////////////////////////
::CoInitialize(NULL);///初始化COM库
_ConnectionPtr m_pConnection;
// _RecordsetPtr m_pRecordset;
////////////连接数据库//////////////
HRESULT hr;
try {
hr = m_pConnection.CreateInstance( __uuidof ( Connection ) );///创建Connection对象
if(SUCCEEDED(hr)) {
//access可以
//hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbTest.mdb","","",adModeUnknown);///连接数据库
//sql server不行
hr = m_pConnection->Open("Provider=SQLOLEDB;Data Source=ricky;Initial Catalog=dbTest; User ID=sa;Password=","","",adModeUnknown);///连接数据库
MessageBeep(MB_OK);
}
}
catch(_com_error e) { ///捕捉异常
MessageBeep(MB_ICONASTERISK);
}//////////////////////////////////////////////////////////
换成下面的代码还是相同的疑点://////////////////////////调试1///////////////////////////////
AfxOleInit();///初始化COM库
_ConnectionPtr m_pConnection;
// _RecordsetPtr m_pRecordset;
////////////连接数据库//////////////
HRESULT hr;
try {
PlayText("1");
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr)) {
//accss可以
//hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbTest.mdb","","",adModeUnknown);///连接数据库
//sql server就是不行,真搞不懂.....:(
hr = m_pConnection->Open("Provider=sqloledb;Data Source=ricky;Initial Catalog=dbTest;Integrated Security=SSPI;","","",adModeUnknown); //连接数据库
PlayText("2");
}
}
catch(_com_error e) { ///捕捉异常
PlayText("错误");
}
////////////////////////////////////////////////////////////////
如能解决问题,1000分送给高手们我都值得。急!!!!!!!!!
::CoInitialize(NULL);///初始化COM库
_ConnectionPtr m_pConnection;
// _RecordsetPtr m_pRecordset;
////////////连接数据库//////////////
HRESULT hr;
try {
hr = m_pConnection.CreateInstance( __uuidof ( Connection ) );///创建Connection对象
if(SUCCEEDED(hr)) {
//access可以
//hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbTest.mdb","","",adModeUnknown);///连接数据库
//sql server不行
hr = m_pConnection->Open("Provider=SQLOLEDB;Data Source=ricky;Initial Catalog=dbTest; User ID=sa;Password=","","",adModeUnknown);///连接数据库
MessageBeep(MB_OK);
}
}
catch(_com_error e) { ///捕捉异常
MessageBeep(MB_ICONASTERISK);
}//////////////////////////////////////////////////////////
换成下面的代码还是相同的疑点://////////////////////////调试1///////////////////////////////
AfxOleInit();///初始化COM库
_ConnectionPtr m_pConnection;
// _RecordsetPtr m_pRecordset;
////////////连接数据库//////////////
HRESULT hr;
try {
PlayText("1");
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr)) {
//accss可以
//hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbTest.mdb","","",adModeUnknown);///连接数据库
//sql server就是不行,真搞不懂.....:(
hr = m_pConnection->Open("Provider=sqloledb;Data Source=ricky;Initial Catalog=dbTest;Integrated Security=SSPI;","","",adModeUnknown); //连接数据库
PlayText("2");
}
}
catch(_com_error e) { ///捕捉异常
PlayText("错误");
}
////////////////////////////////////////////////////////////////
如能解决问题,1000分送给高手们我都值得。急!!!!!!!!!
应该考虑其他因素。
你应该看看连接不成功的错误码是什么,才能对症下药。改这段:
catch(_com_error e) { ///捕捉异常
MessageBeep(MB_ICONASTERISK);
}为这段:
catch(_com_error &e)
{
dump_com_error(e);
}void CMyclassname::dump_com_error(_com_error &e)
{
CString ErrorStr;
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
ErrorStr.Format( "Error!\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n",
e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription );
#ifdef _DEBUG
AfxMessageBox( ErrorStr, MB_OK | MB_ICONERROR );
#endif
}看看错误信息是什么,查查ADO的帮助文件,或MSDN, 都会有很详尽的解释,
告诉你为什么连接不上。
保证你能在DLL里连上。
别忘了送分欧 :)
****************************
Error!
Code=80004005
Code meaning=未指定的错误
Source=Microft OLE DB Provider for SQL Server
Desciption=不能装载通讯模块。驱动程序安装不正确。
**************************** AfxOleInit();///初始化COM库
_ConnectionPtr m_pConnection;
// _RecordsetPtr m_pRecordset;
////////////连接数据库//////////////
HRESULT hr;
try {
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr)) {
//accss可以
//hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbTest.mdb","","",adModeUnknown);///连接数据库
//sql server就是不行,真搞不懂.....:(
hr = m_pConnection->Open("Provider=SQLOLEDB;Data Source=towin;Initial Catalog=dbTest; User ID=Ricky;Password=123","","",adModeUnknown);///连接数据库
PlayText("正确");
}
}
catch(_com_error &e)
{
CString ErrorStr;
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
ErrorStr.Format( "Error!\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n ",
e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription );
#ifdef _DEBUG
AfxMessageBox( ErrorStr, MB_OK | MB_ICONERROR );
#endif
}
Error!
Code=80004005
Code meaning=未指定的错误
Source=Microft OLE DB Provider for SQL Server
Desciption=[Microsoft][ODBC SQL Server Driver]不能装载通讯模块。驱动程序安装不正确。
****************************
//////////////////////////调试2///////////////////////////////
::CoInitialize(NULL);///初始化COM库
_ConnectionPtr m_pConnection;
// _RecordsetPtr m_pRecordset;
////////////连接数据库//////////////
HRESULT hr;
try {
hr = m_pConnection.CreateInstance( __uuidof ( Connection ) );///创建Connection对象
if(SUCCEEDED(hr)) {
//access可以
//hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbTest.mdb","","",adModeUnknown);///连接数据库
//sql server不行
hr = m_pConnection->Open("Driver={SQL Server};SERVER=towin;USER ID=Ricky;PASSWORD=123;DATABASE=dbTest","","",adConnectUnspecified);///连接数据库
MessageBeep(MB_OK);
}
}
catch(_com_error &e)
{ CString ErrorStr;
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
ErrorStr.Format( "Error!\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n ",
e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription );
#ifdef _DEBUG
AfxMessageBox( ErrorStr, MB_OK | MB_ICONERROR );
#endif
}
//////////////////////////////////////////////////////////
这不已经告诉你了吗?
进入SQL的“服务器网络实用工具”把启用协议只留下TCP/IP,
将连接字符改成IP地址
“Data Source=ricky ...”改成
"Data Source=xxx.xx.xxx "的形式
试一下,还不行的话,换一台机子,装SQL客户端,再运行你的程序,总之这种错误与你的程序无关,是其他因素造成的,跟在不在DLL也无关。