采用VC++,ADO访问Oracle 9i数据库,现在数据库已经链接成功,而且可以读出数据库中的内容,奇怪的是,当我向数据库中插入一条记录时,出现了致命错误:请看我写的代码,可错误信息:
在此之前,数据库已经打开,并且可以读取其内容:
try
{
m_pRecordset->AddNew();
m_pRecordset->PutCollect("NAME", _variant_t(m_RecName));
m_pRecordset->PutCollect("SEX", _variant_t(m_RecSex));
m_pRecordset->Update();
AfxMessageBox("添加成功!");
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}错误信息:unhandled exception in connectionoracle.exe(KERNEL32.DLL)0xE06D7363:Microsoft C++ EXCEPTION
在此之前,数据库已经打开,并且可以读取其内容:
try
{
m_pRecordset->AddNew();
m_pRecordset->PutCollect("NAME", _variant_t(m_RecName));
m_pRecordset->PutCollect("SEX", _variant_t(m_RecSex));
m_pRecordset->Update();
AfxMessageBox("添加成功!");
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}错误信息:unhandled exception in connectionoracle.exe(KERNEL32.DLL)0xE06D7363:Microsoft C++ EXCEPTION
pRecordSet->CursorLocation = adUseClient;
我现在怀疑是不是要更新msado15.dll支持文件。
换一种方法
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
2。app文件的InitInstance中加入
if(S_OK!=OleInitialize(NULL))
{
AfxMessageBox("初始化COM组件库错误");
}
下面就是数据库操作
_ConnectionPtr pConn;
_RecordsetPtr pRs;
CString strSQL;
pConn.CreateInstance(__uuidof(Connection));
pConn->CursorLocation=adUseClient;
strSQL="Provider=SQLOLEDB;Server=Gooyan;DataBase=SkillsBox;UID=sa;PWD=aaaaaaaa";
pConn->Open(_bstr_t(strSQL),"","",-1);pRs.CreateInstance(__uuidof(Recordset));
pRs->CursorLocation=adUseClient;
pRs->PutActiveConnection(pConn.GetInterfacePtr());pRs1.CreateInstance(__uuidof(Recordset));
pRs1->CursorLocation=adUseClient;
pRs1->PutActiveConnection(pConn.GetInterfacePtr());strSQL="select * from catalog order by cataid";
pRs->Open(_bstr_t(strSQL),vtMissing,adOpenDynamic,adLockBatchOptimistic,adCmdText);
CString m_sConn="Provider=MSDAORA.1;Data Source=sode_192.168.3.9"; //使用
ms连接库,sode为SID,192.168.3.9为机器ip
m_pConn.CreateInstance("ADODB.Connection");
try
{
HRESULT hr=m_pConn->Open((_bstr_t)m_sConn,"sodeUser","sodePw",adConnectUnspecified);
if (FAILED(hr))
{
AfxMessageBox("不能连接数据库 source!");
return FALSE;
}
}
catch(_com_error e)
{
AfxMessageBox("不能打开数据库 error!");
return FALSE;
}
===>Oracle Connect String微软提供的Oracle标准连接是:strConnect = _T("Provider=MSDAORA;Data Source=serverName;User ID=userName; Password=userPassword;");Oracle公司提供的连接方式:使用标准安全级别:strConnect = _T("Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;");使用信任连接1.strConnect = _T("Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=/;Password=;"); UID为'/'2.strConnect = _T("Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;OSAuthent=1;");使用OSAuthent=1对于连接字符串可以参考以下网页: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdreforacleprovspec.asp?frame=truehttp://download-west.oracle.com/otndoc/oracle9i/901_doc/win.901/a90171/using.htm
是不是这个m_pRecordset是不是已经关闭了?如果没关闭不应该阿。要不就m_pReocrdset.movefirst,然后addnew或者用connectptr对象,直接execute(insert table)首先你吧insert table拿到查询分析器里面看看好永不
OLE DB Provider for Oracle (from Microsoft)
The Microsoft OLE DB Provider for Oracle allows ADO to access Oracle databases.
strConnect = _T("Provider=MSDAORA;Data Source=MyOracleDB;User Id=myUsername;"
"Password=myPassword;");OLE DB Provider for Oracle (from Oracle).
For Standard security:
strConnect = _T("Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;"
"User Id=myUsername;Password=myPassword;");
假若采用OLE DB Provider for Oracle (from Microsoft)这一种链接方式,只能读取,而不能进行添加和删除操作;
假若采用OLE DB Provider for Oracle (from Oracle)这一种链接方式,即可以读取,也可以进行添加和删除等操作。