我在组件里用到msado15.dll访问SQL,vb测试通过,正常访问数据库,但是我到vc里,一导入那组件的类型库就报错,错误如下:
e:\Documents and Settings\vigorpro\My Documents\Visual Studio Projects\DatabaseListView\DatabaseListView\Release\getrec.tlh(48) : error C2146: 语法错误 : 缺少“;”(在标识符“GetRecordset”的前面)
e:\Documents and Settings\vigorpro\My Documents\Visual Studio Projects\DatabaseListView\DatabaseListView\Release\getrec.tlh(48) : error C2501: “GETRECLib::IQueryRec::_RecordsetPtr” : 缺少存储类或类型说明符
e:\Documents and Settings\vigorpro\My Documents\Visual Studio Projects\DatabaseListView\DatabaseListView\Release\getrec.tlh(49) : warning C4183: “GetRecordset”: 缺少返回类型;假定为返回“int”的成员函数
e:\Documents and Settings\vigorpro\My Documents\Visual Studio Projects\DatabaseListView\DatabaseListView\Release\getrec.tli(14) : error C2143: 语法错误 : 缺少“;”(在“GETRECLib::IQueryRec::GetRecordset”的前面)
e:\Documents and Settings\vigorpro\My Documents\Visual Studio Projects\DatabaseListView\DatabaseListView\Release\getrec.tli(14) : error C2433: “_RecordsetPtr” : 不允许在数据声明中使用“inline”
e:\Documents and Settings\vigorpro\My Documents\Visual Studio Projects\DatabaseListView\DatabaseListView\Release\getrec.tli(14) : error C2501: “_RecordsetPtr” : 缺少存储类或类型说明符
e:\Documents and Settings\vigorpro\My Documents\Visual Studio Projects\DatabaseListView\DatabaseListView\Release\getrec.tli(18) : error C2064: 项不会计算为接受 2 个参数的函数
组件很简单,就是一个方法里:STDMETHODIMP CQueryRec::GetRecordset(BSTR queryCmd,_Recordset **RecordsetPtr)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
CoInitialize(NULL);
// AfxOleInit();
_ConnectionPtr pCon(__uuidof(Connection));
pCon->Open(_T("Provider=SQLOLEDB.1;Data source=127.0.0.1;Initial Catalog=Northwind"),_T("sa"),_T(""),adOpenUnspecified);
_CommandPtr pCmd(__uuidof(Command));
pCmd->ActiveConnection=pCon;
CString command(queryCmd);
pCmd->CommandText=command.operator LPCTSTR();
_RecordsetPtr rptr(__uuidof(Recordset));
rptr->PutRefSource(pCmd);
_variant_t vNull(DISP_E_PARAMNOTFOUND,VT_ERROR);
rptr->Open(vNull,vNull,adOpenDynamic,adLockOptimistic,adCmdText);
rptr->QueryInterface(__uuidof(_Recordset),(void**)RecordsetPtr);
CoUninitialize();
return S_OK;
}觉得奇怪,vb没问题,不知道是怎么的,先谢谢^^
e:\Documents and Settings\vigorpro\My Documents\Visual Studio Projects\DatabaseListView\DatabaseListView\Release\getrec.tlh(48) : error C2146: 语法错误 : 缺少“;”(在标识符“GetRecordset”的前面)
e:\Documents and Settings\vigorpro\My Documents\Visual Studio Projects\DatabaseListView\DatabaseListView\Release\getrec.tlh(48) : error C2501: “GETRECLib::IQueryRec::_RecordsetPtr” : 缺少存储类或类型说明符
e:\Documents and Settings\vigorpro\My Documents\Visual Studio Projects\DatabaseListView\DatabaseListView\Release\getrec.tlh(49) : warning C4183: “GetRecordset”: 缺少返回类型;假定为返回“int”的成员函数
e:\Documents and Settings\vigorpro\My Documents\Visual Studio Projects\DatabaseListView\DatabaseListView\Release\getrec.tli(14) : error C2143: 语法错误 : 缺少“;”(在“GETRECLib::IQueryRec::GetRecordset”的前面)
e:\Documents and Settings\vigorpro\My Documents\Visual Studio Projects\DatabaseListView\DatabaseListView\Release\getrec.tli(14) : error C2433: “_RecordsetPtr” : 不允许在数据声明中使用“inline”
e:\Documents and Settings\vigorpro\My Documents\Visual Studio Projects\DatabaseListView\DatabaseListView\Release\getrec.tli(14) : error C2501: “_RecordsetPtr” : 缺少存储类或类型说明符
e:\Documents and Settings\vigorpro\My Documents\Visual Studio Projects\DatabaseListView\DatabaseListView\Release\getrec.tli(18) : error C2064: 项不会计算为接受 2 个参数的函数
组件很简单,就是一个方法里:STDMETHODIMP CQueryRec::GetRecordset(BSTR queryCmd,_Recordset **RecordsetPtr)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
CoInitialize(NULL);
// AfxOleInit();
_ConnectionPtr pCon(__uuidof(Connection));
pCon->Open(_T("Provider=SQLOLEDB.1;Data source=127.0.0.1;Initial Catalog=Northwind"),_T("sa"),_T(""),adOpenUnspecified);
_CommandPtr pCmd(__uuidof(Command));
pCmd->ActiveConnection=pCon;
CString command(queryCmd);
pCmd->CommandText=command.operator LPCTSTR();
_RecordsetPtr rptr(__uuidof(Recordset));
rptr->PutRefSource(pCmd);
_variant_t vNull(DISP_E_PARAMNOTFOUND,VT_ERROR);
rptr->Open(vNull,vNull,adOpenDynamic,adLockOptimistic,adCmdText);
rptr->QueryInterface(__uuidof(_Recordset),(void**)RecordsetPtr);
CoUninitialize();
return S_OK;
}觉得奇怪,vb没问题,不知道是怎么的,先谢谢^^
#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);
#pragma warning(disable:4146)
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
#pragma warning(default:4146)
using namespace ADODB; //加上名字空间int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH: //初始化 COM
CoInitialize(NULL);
break;
case DLL_PROCESS_DETACH: //释放 COM
CoUninitialize();
break;
#import "C:\Program Files\Common Files\System\ado\msado15.dll"
no_namespace rename("EOF","adoEOF")
就会出现你所说的错误,改正如下,一切OK:
#import "C:\Program Files\Common Files\System\ado\msado15.dll" \
no_namespace rename("EOF","adoEOF")
邮箱:[email protected]