hur.cn - 华软网

 热门搜索

VC用ADO连接数据库时遇到的问题,求大神指教

  作者:未知    来源:网络    更新时间:2011/5/30
CDatabaseApp::CDatabaseApp()
{
      m_AppConnString=_T("Driver={SQL Server};Server=192.168.1.104;")
      _T("Database=huiyuan;Uid=tao;Pwd=111;");     //初始化连接字符串
    m_bConnected=FALSE;                                //初始化连接标志
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CDatabaseApp object

CDatabaseApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CDatabaseApp initialization

BOOL CDatabaseApp::InitInstance()
{
AfxEnableControlContainer();
HRESULT hRes;                                     //定义返回值变量
 try
{
 hRes=m_pAppConn.CreateInstance(_T("ADODB.Connection"));
 m_pAppConn->ConnectionTimeout=8;                 //打开数据库连接
 hRes=m_pAppConn->Open(_bstr_t((LPCTSTR) m_AppConnString),_T(""),_T(""),adModeUnknown);
 if(SUCCEEDED(hRes))
 {
m_bConnected=TRUE;                                //连接成功设置标志位
 }
}
catch(_com_error e)                               //捕捉错误异常
{
CString errormessage;                             //定义错误显示字符串
errormessage.Format(_T("连接数据库失败 :%s"),e.ErrorMessage());
AfxMessageBox(errormessage);   //显示错误信息
return FALSE;
}
……
运行结果:    连接数据库失败 :无效指针
小弟初学,书上抄的代码,不懂为什么会出现这样的情况,求指教……
---华软 网友回答---
ADO访问数据库的基本步骤:

(1)、引入ADO类 ,加到stdafx.h中#endif // _AFX_NO_AFXCMN_SUPPORT后面   
 
#import "c:\program files\common files\system\ado\msado15.dll" \   
no_namespace \   
rename ("EOF", "adoEOF")   

(2)、初始化COM (放在对话框初始化函数里面或者CXXXApp::InitInstance()中)
 
在MFC中可以用AfxOleInit();非MFC环境中用:   
CoInitialize(NULL);   

(3)、包含后就可以用3个智能指针了:_ConnectionPtr、_RecordsetPtr和_CommandPtr   

(4)、连接数据库
HRESULT hr;   
  try   
  {   
  hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象   
  if(SUCCEEDED(hr))   
  {   
  m_pConnection->ConnectionTimeout = 0;   
  hr = m_pConnection->Open( "Provider=SQLOLEDB.1;Password=密码;Persist Security Info=True;User ID=用户名;Initial Catalog=数据库名;Data Source=127.0.0.1(本机)", "", "", adConnectUnspecified);   
    
  m_pCommand.CreateInstance(__uuidof(Command));   
  m_pCommand->CommandTimeout = 5;   
  m_pCommand->ActiveConnection = m_pConnection;   
  }   
  }   
  catch(_com_error e)///捕捉异常   
  {   
  CString errormessage;   
  errormessage.Format("连接数据库失败!\r\n错误信息:%s,%s",e.ErrorMessage(),e.Description());   
  AfxMessageBox(errormessage);///显示错误信息   
  }   
 
(5)、打开记录集
首先创建一个_RecordsetPtr实例,然后调用Open()得到一条SQL语句的执行结果   
_RecordsetPtr m_pRecordset;   
m_pRecordset.CreateInstance(__uuidof(Recordset));   
 
// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,   
// 因为它有时会经常出现一些意想不到的错误
try   
{   
  m_pRecordset->Open("SELECT * FROM DemoTable",// 查询DemoTable表中所有字段   
  m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针   
  adOpenDynamic,   
  adLockOptimistic,   
  adCmdText);   
}   
catch(_com_error *e)   
{   
  AfxMessageBox(e->ErrorMessage());   
}   

……

照着检查一下,看看你是不是每一步都做了,记得数据库操作try catch一下,捕捉一下有意义的错误提示 
---华软网友回复---
顶一个吧
---华软网友回复---
引入ADO库没有,初始化COM了吗?
---华软网友回复---
引用 1 楼 king_hhuang 的回复:
ADO访问数据库的基本步骤:

(1)、引入ADO类 ,加到stdafx.h中#endif // _AFX_NO_AFXCMN_SUPPORT后面   
 
#import "c:\program files\common files\system\ado\msado15.dll" \   
no_namespace \   
rename ("EOF", "adoEOF")   
……

---华软网友回复---
引用 3 楼 ehongkong 的回复:
引入ADO库没有,初始化COM了吗?

已经引入了 也初始化了COM
---华软网友回复---
菜鸟写的vc +ado +数据库操作 新人可以看看
http://blog.csdn.net/tt2com/archive/2010/10/28/5971283.aspx
---华软网友回复---
我以前遇到过类似的问题,是因为没有初始化COM.在构造函数里初始化COM就解决了问题。楼主在哪里初始化COM的,我看你在CDatabaseApp的构造函数CDatabaseApp()和初始化实例InitInstance()都没有初始化COM的代码。一般是先有构造函数后有InitInstance()
---华软网友回复---
确实是初始化COM的问题多谢大家的帮组……      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。