win32控制台连接ACCESS数据库问题

jianglei250979630 2011-01-02 10:38:57
小弟做一个win32 简单用ADO调用ACCESS里面的东西 我编译的时候通过了 但是运行的时候我有一些问题请教各位大虾们
先附上源码:
#include <cstdio>
#include <iostream>
//由于引入ADO库文件时候,会产生警告 4146,但这个警告是没关系的,所以使用下一句代码屏蔽它
#pragma warning(disable: 4146)

//引入ADO库文件 注意C:\Program Files\Common Files\System\ado\msado15.dll这是指系统盘下,
//如果你的系统盘是D盘的话 那么应该是D:\Program Files\Common Files\System\ado\msado15.dll
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")

using namespace std;
_ConnectionPtr m_pCon; //申明Connection指针
_RecordsetPtr m_pRec; //申明Recordset指针

void Initialize(); //初始化资源操作
void ReadingDB(); //读取数据库操作
void AddDB(); //增加数据操作

void HandingDB(); //数据处理操作
int main(int argc, char* argv[]);//主程序处理程序

int main(int argc, char* argv[])
{
Initialize(); //初始化

HandingDB(); //处理函数



return 0;
}


//初始化
void Initialize()
{
::CoInitialize(NULL); //初始化OLE/COM库环境

//****************************************************************************
// _ConnectionPtr通常被用来创建一个数据连接或执行一条不返回任何结果的SQL语句,
// 如一个存储过程。

// _ConnectionPtr m_pCon(__uuidof(Connection));
m_pCon.CreateInstance(__uuidof(Connection));
//*****************************************************************************

//****************************************************************************
//_RecordsetPtr是一个记录集对象。与以上两种对象相比它对记录集提供了更多的控制功能,
// 如记录锁定、游标控制等

// _RecordsetPtr m_pRec(__uuidof(Recordset));
m_pRec.CreateInstance(__uuidof(Recordset));
//*****************************************************************************

try
{
//连接数据库
m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=access.mdb","","",adModeUnknown);
}
catch(_com_error e)
{
cout<<e.ErrorMessage(); //输出错误信息
}
try
{
m_pRec->Open("SELECT * FROM Lib",
_variant_t((IDispatch*)m_pCon,true),
adOpenStatic,
adLockOptimistic,
adCmdText);
//adOpenStatic: 静态 adOpenDynamic:动态 adLockOptimistic乐观封锁法 adCmdText:文本查询语句
}
catch(_com_error e)
{
cout<<e.ErrorMessage(); //输出错误信息
}
}

//读取数据库
void ReadingDB()
{

cout<<"\nNumber Name age address tel\n";
m_pRec->MoveFirst();
while(!m_pRec->adoEOF)
{
cout<<(_bstr_t)(m_pRec->GetCollect("Number"));
cout<<" ";
cout<<(_bstr_t)(m_pRec->GetCollect("Name"));
cout<<" ";
cout<<(_bstr_t)(m_pRec->GetCollect("Age"));
cout<<" ";
cout<<(_bstr_t)(m_pRec->GetCollect("Address"));
cout<<" ";
cout<<(_bstr_t)(m_pRec->GetCollect("Tel"));
cout<<"\n";
m_pRec->MoveNext();
}
m_pRec->MoveFirst();
}


//增加数据
void AddDB()
{

char m_Tel[20],m_Number[20],m_Age[20],m_Name[20],m_Address[20];
bool m_flag=true; //判断增加操作是否成功的标志

cout<<"请输入要增加的Number\n";
scanf("%c",&m_Number);

cout<<"请输入要增加的Name\n";
scanf("%c",&m_Name);

cout<<"请输入要增加的Age\n";
scanf("%c",&m_Age);

cout<<"请输入要增加的Address\n";
scanf("%c",m_Address);

cout<<"请输入要增加的Tel\n";
scanf("%c",&m_Tel);

try{
//增加数据到数据库操作
m_pRec->AddNew();
m_pRec->PutCollect("Number", atol(m_Number));
m_pRec->PutCollect("Name", _variant_t(m_Name));
m_pRec->PutCollect("Age", atol(m_Age));
m_pRec->PutCollect("Address", _variant_t(m_Address));
m_pRec->PutCollect("Tel", atol(m_Tel));

m_pRec->Update();
}
catch(_com_error e)
{
m_flag=false;
cout<<e.ErrorMessage();
}

if(m_flag) //判断操作成功的输出语句
cout<<"增加操作成功\n";
else
cout<<"增加操作失败\n";
ReadingDB(); //从新读取数据库,并且显示
}

//处理函数
void HandingDB()
{
ReadingDB(); //读取数据库,并且显示
char m_str[10],m_char;

while(1)
{
cout<<"\n操作输入:\nQ 退出: A 增加数据\n";

cin>>m_str;
sscanf( m_str, "%c", &m_char ); //将m_str转化为字符,并保存在m_char中

if('Q'==m_char||'q'==m_char)
break; //退出程序

if('A'==m_char||'a'==m_char)
AddDB(); //增加数据
}
}
调试的时候出***。exe的 0x75619617 处未处理的异常: Microsoft C++ 异常: 内存位置 0x0022f9c0 处的 _com_error。
请问有什么解决方法否
...全文
190 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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