请帮忙看看有关adoEOF问题,

shuhua_33 2006-10-27 01:38:40
今天遇到了这样一个问题,请高手们帮忙看看:

我用的是vc6.0 数据库是SQL Server2000, 采用ADO方式
现在出现了以下问题:
最后运行结果提示:
'adoEOF' : is not a member of '_Recordset'


////////////////////////////////////////////
_RecordsetPtr m_pRs;

/////////////////////////////////////////

在CSERVERDlg()中有:
m_strConnection = _T("Provider=SQLOLEDB.1;Integrated;curity=SSPI;PersistSecurity Info=False;User ID=sqlserver;Initial Catalog=server_data;Data Source=(local)");

.....
DBSearchInitTable(); // build new table_gps_data

////////////////////////////////
在OnInitDialog()中

m_strCmdText =_T(m_Table_GPS_Data_Name); //定义命令文本内容

m_pRs.CreateInstance(__uuidof(Recordset)); //创建connection对象实例
m_pRs->CursorLocation = adUseClient; //设置游标位置
//打开记录集
m_pRs->Open((LPCTSTR)m_strCmdText, //命令文本内容
(LPCTSTR)m_strConnection, //连接字符串
adOpenKeyset, //设置游标类型
adLockOptimistic, //设置锁定类型
adCmdTableDirect);
////////////////////////////

在DBSearchInitTable()中
if(m_pRs->State)
{
m_pRs->Close();
}

m_pRs=m_pConnection->OpenSchema(adSchemaTables);
while(!(m_pRs->adoEOF)) ////出现了问题。
{
_bstr_t table_name = m_pRs->Fields->GetItem("TABLE_NAME")->Value;
_bstr_t table_type = m_pRs->Fields->GetItem("TABLE_TYPE")->Value;

....

m_pRs->MoveNext();
}

///////////////////////////////////////////////
问题出现后我怀疑是不是不支持SQL Server的问题,所有在一篇文章看到用getEOF的方法

VARIANT_BOOL bEOF;
m_pRs->get_EOF(&bEOF);
while(!bEOF)
{
_bstr_t table_name = m_pRs->Fields->GetItem("TABLE_NAME")->Value;
_bstr_t table_type = m_pRs->Fields->GetItem("TABLE_TYPE")->Value;

....

m_pRs->MoveNext();

}
最终的结果还是提示: 'get_EOF' : is not a member of '_Recordset'





...全文
756 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
exocet 2007-02-08
  • 打赏
  • 举报
回复
刚遇到类似的问题: 'adoEOF' : is not a member of '_Recordset'
参考这个帖子,忙乎好久.发现是自己粗心.
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "adoEOF")
这句里用的不是 "adoEOF",而是"adoEnd",因为是拷贝别人代码,而且不同人习惯不一样.所以还是要细心.

MSDN里有的地方用的是"EndOfFile"
尘雨 2006-10-29
  • 打赏
  • 举报
回复
具体原因是什么呢?我也想知道
shuhua_33 2006-10-29
  • 打赏
  • 举报
回复

昨天回家前终于解决了,谢谢你了,vieri_ch(尘雨),给了不少建议,让我查出原因了。say thanks again!
尘雨 2006-10-28
  • 打赏
  • 举报
回复
这是我测试成功的代码,在我这里保证可运行,记得用msado15.dll,而且本机的ado版本不要低于2.7
/////////stdafx.h////////////
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
////////////////////////////
/////////test.cpp的关键代码//////////
if(FAILED(::CoInitialize(NULL)))
return 0;
// Define ADO object pointers.
// Initialize pointers on define.
// These are in the ADODB:: namespace.
_ConnectionPtr pConnection = NULL;
_RecordsetPtr pRstSchema = NULL;

//Other Variables
HRESULT hr = S_OK;

/*_bstr_t strCnn("Provider='sqloledb';Data Source='(local)';"
"Initial Catalog='pubs';Integrated Security='SSPI';");*/

_bstr_t strCnn("Driver={SQL Server};Server=(local);Uid=sa;Pwd=p6lx+;DataBase=pubs");
// Open connection.
pConnection.CreateInstance(__uuidof(Connection));
pConnection->Open (strCnn, "", "", adConnectUnspecified);

pRstSchema = pConnection->OpenSchema(adSchemaTables);
int intLine=0;
while(!(pRstSchema->EndOfFile))
{
_bstr_t table_name = pRstSchema->Fields->
GetItem("TABLE_NAME")->Value;

printf("Table Name: %s\n",(LPCSTR) table_name);

_bstr_t table_type = pRstSchema->Fields->
GetItem("TABLE_TYPE")->Value;

printf("Table type: %s\n\n",(LPCSTR) table_type);

pRstSchema->MoveNext();

intLine = intLine + 1;
if (intLine % 5 == 0)
{
printf("\nPress any key to continue...");
getch();
//Clear the screen for the next display
system("cls");
}
}

if (pRstSchema)
if (pRstSchema->State == adStateOpen)
pRstSchema->Close();
if (pConnection)
if (pConnection->State == adStateOpen)
pConnection->Close();

::CoUninitialize();
尘雨 2006-10-28
  • 打赏
  • 举报
回复
在你的计算机里搜索ado210.chm,其实能解决你所需要的,使用sql脚本的好处,就是标准
OpenSchema这个方法感在access好像比较常用,但是对于sqlserver, oracle还是用SQL脚本来判断吧

其实多条SQL语句可以写在一个字符串中,用分号相隔,用一次pconn->execute()这样可以实现批处理运行这些sql语句,你的需求就可以这么做。
shuhua_33 2006-10-28
  • 打赏
  • 举报
回复
vieri_ch(尘雨) 你不是说:

在sql server里查询表是否存在可不是这样的
if not exists (select * from dbo.sysobjects where id = object_id(N'[testtable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
create table [testtable]{
..}

怎么上面还是用
while(!(pRstSchema->EndOfFile))
{
....
}
这种形式?

而且我只能用ADO2.0的库,不能就编译时有警告。

我改成用你这么做法连接数据库什么的。跟前面情况一样。当运行到while(!(pRstSchema->EndOfFile))这句就跳出来了。
尘雨 2006-10-28
  • 打赏
  • 举报
回复
你的操作系统,开发环境版本,还有c:\Program Files\Common files\System\ADO\msado15.dll" 是否存在,另外mdac的版本一定要安装2。6以上,最新2.8
尘雨 2006-10-28
  • 打赏
  • 举报
回复
好像问题不在程序里,有可能是系统或者开发环境的问题了
shuhua_33 2006-10-27
  • 打赏
  • 举报
回复
就是说在连接 SQL Server时以下的方法是不行的是不?

_bstr_t table_name = m_pRs->Fields->GetItem("TABLE_NAME")->Value;
_bstr_t table_type = m_pRs->Fields->GetItem("TABLE_TYPE")->Value;

都用sql语言实现?我好像也看过这样的做法的。

你们有用VC,SQL Server2000,ADO方式的这方面的文章没?最好是有完整代码的。感觉看了一下这么写,一下那么写,都不知道到底怎么写了。
尘雨 2006-10-27
  • 打赏
  • 举报
回复
_Recordset 永远都指向的是最新的ADO版本,因该是2.8以上了

#import "D:\Program Files\Common Files\system\ado\msado20.tlb" rename_namespace("ADOCG") rename("EOF", "EndOfFile")

最好还是用15吧,20不代表什么

尘雨 2006-10-27
  • 打赏
  • 举报
回复
原来你的需求是这样
在sql server里查询表是否存在可不是这样的
if not exists (select * from dbo.sysobjects where id = object_id(N'[testtable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
create table [testtable]{
..}
把这个当作sql语句来运行就OK

shuhua_33 2006-10-27
  • 打赏
  • 举报
回复
我刚才发现了一个问题,
我在头文件里加的是:
#import "D:\Program Files\Common Files\system\ado\msado20.tlb" rename_namespace("ADOCG") rename("EOF", "EndOfFile")

所以用EndOfFile对,而用adoEoF错的原因了。

我用adoEoF过程中看到错误指示要我看清。
_Recordset : _Recordset15

现在用了20的,是不是要改上面的为_Recordset : _Recordset20,还是别的。

这是我所能想到可能不进入程序的原因了,你们觉得是什么问题呢?




shuhua_33 2006-10-27
  • 打赏
  • 举报
回复
是不是用vc在操作SQL Server时 ADO和Access方法有写不同啊?
其实我也就是想实现根据日期建表,如果当天没有表时建表,然后写入数据,如果当日有表时直接写入数据的功能。



尘雨 2006-10-27
  • 打赏
  • 举报
回复
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "adoEOF")
这个地方定义了adoEOF,按理说要错都错,怎么EndOfFile就不一样呢
shuhua_33 2006-10-27
  • 打赏
  • 举报
回复
如果改成adoEOF就错了。我也找了一篇文章有这么写的,但不知为什么结果有误错误。看调试的结果都不是那样的
尘雨 2006-10-27
  • 打赏
  • 举报
回复
只是参考,你定义的adoEOF,那就还用m_pRs->adoEOF
shuhua_33 2006-10-27
  • 打赏
  • 举报
回复
链接对象改称服务端游标了。

其它前面的我没有改,就把while那句改成了
while(!(m_pRs->EndOfFile))
{
_bstr_t table_name = m_pRs->Fields->GetItem("TABLE_NAME")->Value;
_bstr_t table_type = m_pRs->Fields->GetItem("TABLE_TYPE")->Value;
....
}
catch(_com_error e)
{
::MessageBox(NULL,e.Description(),"数据库操作报告",MB_OK);
if(m_pRs->State)
m_pRs->Close();
}


错误是没有了,但会结果有问题,不知道是为什么,按理m_pRs->EndOfFile结果为假,但调试时一到while(!(m_pRs->EndOfFile)) 这段就跳了出来,到了catch()中。
尘雨 2006-10-27
  • 打赏
  • 举报
回复
在链接对象不要用客户端游标,改称服务端游标
尘雨 2006-10-27
  • 打赏
  • 举报
回复
_RecordsetPtr pRstSchema = NULL;

SAFEARRAY FAR* psa = NULL;
SAFEARRAYBOUND rgsabound;
_variant_t var;
_variant_t Array;
rgsabound.lLbound = 0;
rgsabound.cElements = 4;
psa = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);
var.vt = VT_EMPTY;
long ix;
ix = 0;
SafeArrayPutElement(psa, &ix, &var);

ix= 1;
SafeArrayPutElement(psa, &ix, &var);

ix = 2;
SafeArrayPutElement(psa, &ix, &var);

var.vt = VT_BSTR;
//表的类型有"ALIAS""TABLE""SYNONYM""SYSTEM TABLE" "VIEW""GLOBAL TEMPORARY""LOCAL TEMPORARY""SYSTEM VIEW"
var.bstrVal = bstrFilter;//这里bstrFilter="TABLE"就可以了

ix = 3;
SafeArrayPutElement(psa, &ix, &var);

var.vt=VT_EMPTY;
Array.vt = VT_ARRAY|VT_VARIANT;
Array.parray = psa;

try
{
pRstSchema = pConnection->OpenSchema(adSchemaTables,&Array);

*nTableCount=0;
while(!(pRstSchema->EndOfFile))
{
if(bstrTableNames!=NULL)
{
_bstr_t table_name = pRstSchema->Fields->
GetItem("TABLE_NAME")->Value;
*(bstrTableNames++)=table_name;
}
*nTableCount+=1;
pRstSchema->MoveNext();
}
}
catch (_com_error e) {
PrintComError(e);
}
尘雨 2006-10-27
  • 打赏
  • 举报
回复
你的是编译错误还是运行错误,是在线程里还是在主线程里
加载更多回复(4)

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧