数据库问题,小弟毕业设计,急,在线ING。。。。。

nineclock 2004-04-25 02:40:26
:\program\888\Login1.cpp(50) : error C2146: syntax error : missing ';' before identifier '_variant_t'
E:\program\888\Login1.cpp(50) : error C2146: syntax error : missing ';' before identifier 'vFieldValue'
E:\program\888\Login1.cpp(50) : error C2275: '_variant_t' : illegal use of this type as an expression
c:\program files\microsoft visual studio\vc98\include\comutil.h(785) : see declaration of '_variant_t'
E:\program\888\Login1.cpp(50) : error C2065: 'vFieldValue' : undeclared identifier
E:\program\888\Login1.cpp(52) : error C2065: 'm_pCon' : undeclared identifier
E:\program\888\Login1.cpp(52) : error C2228: left of '.CreateInstance' must have class/struct/union type
E:\program\888\Login1.cpp(53) : error C2227: left of '->Open' must point to class/struct/union
E:\program\888\Login1.cpp(55) : error C2065: 'm_pRs' : undeclared identifier
E:\program\888\Login1.cpp(55) : error C2228: left of '.CreateInstance' must have class/struct/union type
E:\program\888\Login1.cpp(56) : error C2227: left of '->Open' must point to class/struct/union
E:\program\888\Login1.cpp(56) : error C2228: left of '.GetInterfacePtr' must have class/struct/union type
E:\program\888\Login1.cpp(57) : error C2227: left of '->EndOfFile' must point to class/struct/union
E:\program\888\Login1.cpp(59) : error C2227: left of '->GetCollect' must point to class/struct/union
E:\program\888\Login1.cpp(60) : error C2440: 'type cast' : cannot convert from 'int' to 'class _bstr_t'
No constructor could take the source type, or constructor overload resolution was ambiguous
我一头雾水,小弟初学VC,不知道怎么用这个数据库,出了一大堆错误,高手救我
...全文
26 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
leafisyellow 2004-04-25
  • 打赏
  • 举报
回复
首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,只需要直接用#import引用它既可。可以直接在Stdafx.h文件中加入下面语句来实现:

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")
其中路径名可以根据自己系统安装的ADO支持文件的路径来自行设定。当编译器遇到#import语句时,它会为引用组件类型库中的接口生成包装类,#import语句实际上相当于执行了API涵数LoadTypeLib()。#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。语句no_namespace说明ADO对象不使用命名空间,rename ("EOF", "adoEOF")说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。
其次,在程序初始过程中需要初始化组件,一般可以用CoInitialize(NULL);来实现,这种方法在结束时要关闭初始化的COM,可以用下面语句CoUnInitialize();来实现。在MFC中还可以采用另一种方法来实现初始化COM,这种方法只需要一条语句便可以自动为我们实现初始化COM和结束时关闭COM的操作,语句如下所示: AfxOleInit();
接着,就可以直接使用ADO的操作了。我们经常使用的只是前面用#import语句引用类型库时,生成的包装类.tlh中声明的智能指针中的三个,它们分别是_ConnectionPtr、_RecordsetPtr和_CommandPtr。下面分别对它们的使用方法进行介绍:
1、_ConnectionPtr智能指针,通常用于打开、关闭一个库连接或用它的Execute方法来执行一个不返回结果的命令语句(用法和_CommandPtr中的Execute方法类似)。
——打开一个库连接。先创建一个实例指针,再用Open打开一个库连接,它将返回一个IUnknown的自动化接口指针。代码如下所示: _ConnectionPtr m_pConnection;
// 初始化COM,创建ADO连接等操作
AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));

// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些意想不到的错误。jingzhou xu
try
{
// 打开本地Access库Demo.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("数据库连接失败,确认数据库Demo.mdb是否在当前路径下!");
return FALSE;
}
——关闭一个库连接。如果连接状态有效,则用Close方法关闭它并赋于它空值。代码如下所示: if(m_pConnection->State)
m_pConnection->Close();
m_pConnection= NULL;
2、_RecordsetPtr智能指针,可以用来打开库内数据表,并可以对表内的记录、字段等进行各种操作。
——打开数据表。打开库内表名为DemoTable的数据表,代码如下: _RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));

// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些意想不到的错误。jingzhou xu
try
{
m_pRecordset->Open("SELECT * FROM DemoTable", // 查询DemoTable表中所有字段
theApp.m_pConnection.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
——读取表内数据。将表内数据全部读出并显示在列表框内,m_AccessList为列表框的成员变量名。如果没有遇到表结束标志adoEOF,则用GetCollect(字段名)或m_pRecordset->Fields->GetItem(字段名)->Value方法,来获取当前记录指针所指的字段值,然后再用MoveNext()方法移动到下一条记录位置。代码如下所示: _variant_t var;
CString strName,strAge;
try
{
if(!m_pRecordset->BOF)
m_pRecordset->MoveFirst();
else
{
AfxMessageBox("表内数据为空");
return;
}

// 读入库中各字段并加入列表框中
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("Name");
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);
var = m_pRecordset->GetCollect("Age");
if(var.vt != VT_NULL)
strAge = (LPCSTR)_bstr_t(var);

m_AccessList.AddString( strName + " --> "+strAge );

m_pRecordset->MoveNext();
}

// 默认列表指向第一项,同时移动记录指针并显示
m_AccessList.SetCurSel(0);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
qk818qk 2004-04-25
  • 打赏
  • 举报
回复
是不是没在StdAfx.h的头文件中加入 #include <afxdb.h> //对ODBC数据库的支持
菜牛 2004-04-25
  • 打赏
  • 举报
回复
好像你把_variant_t类型名称作为表达式了。
GOTO_2002 2004-04-25
  • 打赏
  • 举报
回复
别忘记了
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
GOTO_2002 2004-04-25
  • 打赏
  • 举报
回复
是不是没有定义m_pCon m_pRs ?
_ConnectionPtr m_pCon;
_RecordsetPtr m_pRs;
nineclock 2004-04-25
  • 打赏
  • 举报
回复
没办法啊,总不能不做毕业设计吧
nineclock 2004-04-25
  • 打赏
  • 举报
回复
没人顶,我自己顶一个
bm1408 2004-04-25
  • 打赏
  • 举报
回复
用VC写数据库的确是很麻烦!
我的毕设前一阶段也是用到了数据库,不过我改成用DELLPHI写了!
光是这么提示得不到什么!
最好细细的看看源代码!

4,012

社区成员

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

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