关于ADO与access数据库连接的问题求教(都研究了八天了)

wyhgo2006 2012-08-09 07:08:37
是这样的,我封装了一个ADOConn的类,然后再桌面上建了一个access数据库,但是始终提示连接不上数据库,求指教,我是菜鸟。具体代码如下:
ADOConn类中的OnInitADOConn函数如下:
BOOL ADOConn::OnInitADOConn(LPCTSTR ConnStr)
{
::CoInitialize(NULL);

try
{
// 创建Connection对象
m_pConnection.CreateInstance("ADODB.Connection");
// 设置连接字符串,必须是BSTR型或者_bstr_t类型
_bstr_t strConnect = _bstr_t(ConnStr);//"Provider=SQLOLEDB; Server=127.0.0.1;Database=EventLogg; uid=event; pwd=event;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
return TRUE;
}
// 捕捉异常
catch(_com_error e)
{
// 显示错误信息
TRACE(e.Description());
// sprintf(error,"连接数据库失败 请检查连接字符串\r\n当前连接字符串为:%s",ConnStr);
// throw new CADOException(error);
throw new CADOException("连接数据库失败");
}

}
再创建列表格式的代码是下面这样的:
BOOL CDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
m_Grid.SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT
| LVS_EX_GRIDLINES | LVS_EX_ONECLICKACTIVATE);
m_Grid.InsertColumn(0,"编号",LVCFMT_LEFT,70,0);
m_Grid.InsertColumn(1,"姓名",LVCFMT_LEFT,70,0);
m_Grid.InsertColumn(2,"性别",LVCFMT_LEFT,70,0);
m_Grid.InsertColumn(3,"职务",LVCFMT_LEFT,70,0);
m_Grid.InsertColumn(4,"部门",LVCFMT_LEFT,70,0);
m_Grid.InsertColumn(5,"电话",LVCFMT_LEFT,130,0);
AddToGrid();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
AddToGrid函数如下:
void CDlg::AddToGrid()
{
ADOConn m_adoconn;
m_adoconn.OnInitADOConn("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Administrator\Desktop\ado.mdb;Persist Security Info=False");
CString sql;
sql.Format("select * from TB_PHONEBOOK");
m_adoconn.m_pRecordset=m_adoconn.GetRecordSet((_bstr_t)sql);
int i=0;
while(!m_adoconn.m_pRecordset->adoEOF)
{
m_Grid.InsertItem(i,"");
m_Grid.SetItemText(i,0,(char*)(_bstr_t)m_adoconn.m_pRecordset->GetCollect("编号"));
m_Grid.SetItemText(i,1,(char*)(_bstr_t)m_adoconn.m_pRecordset->GetCollect("姓名"));
m_Grid.SetItemText(i,2,(char*)(_bstr_t)m_adoconn.m_pRecordset->GetCollect("性别"));
m_Grid.SetItemText(i,3,(char*)(_bstr_t)m_adoconn.m_pRecordset->GetCollect("职务"));
m_Grid.SetItemText(i,4,(char*)(_bstr_t)m_adoconn.m_pRecordset->GetCollect("部门"));
m_Grid.SetItemText(i,5,(char*)(_bstr_t)m_adoconn.m_pRecordset->GetCollect("电话"));
m_adoconn.m_pRecordset->MoveNext();
i++;

}
m_adoconn.ExitConnection();
...全文
179 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
Provider=SQLOLEDB改为
Provider=SQLOLEDB.1
wyhgo2006 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
你的StdAfx.h中有没有包含
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace\
rename("EOF","adoEOF")rename("BOF","adoBOF") //导入ADO动态链接库
[/Quote]
有,而且编译不出错
傻X 2012-08-10
  • 打赏
  • 举报
回复
7楼工具很不错
Ginie 2012-08-10
  • 打赏
  • 举报
回复
你的StdAfx.h中有没有包含
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace\
rename("EOF","adoEOF")rename("BOF","adoBOF") //导入ADO动态链接库
vc_xingshou 2012-08-10
  • 打赏
  • 举报
回复
是不是你的ACESS的问题?
wyhgo2006 2012-08-09
  • 打赏
  • 举报
回复
自己顶
wyhgo2006 2012-08-09
  • 打赏
  • 举报
回复
以上说法我已经都试过了,不行啊,希望大家能给帮忙找找什么原因,哪里出错了啊
wyhgo2006 2012-08-09
  • 打赏
  • 举报
回复
回复一楼,你说那种方法我已经试过了,不管用的啊,我是在win7系统下用的vc++6.0
hdg3707 2012-08-09
  • 打赏
  • 举报
回复
给你个例子:
m_pConn->Open("Provider=SQLOLEDB.1;Server=PC-201012170947\\WINCC;DataBase=;UID=sa;PWD=","","",adConnectUnspecified);
这是SQL 2000的连接字符串,你把它加到下面的相应的语句里:

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")
头文件里类里:
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
_CommandPtr m_pCommand;

CPP文件里:
BOOL CDatabaseDll::OpenDatabaseFun(_ConnectionPtr pConnection,_RecordsetPtr pRecordset,_CommandPtr pCommand)
{
BOOL Result=TRUE;
HRESULT hr;
try
{
hr = pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
pConnection->ConnectionTimeout = 10;
// hr = m_pConnection->Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\NW.mdb","", "", adModeUnknown);//这是OFFICE2003以下的
hr = pConnection->Open("Provider=Microsoft.Ace.Oledb.12.0;Data Source=D:\\bagayalu.accdb;Jet OLEDB:Database Password=123456","", "", adModeUnknown);//这是OFFICE2007以上的,包括OFFICE2010,这个连接字符串就是在OFFICE2010下用的,没问题

//m_pConnection->PutDefaultDatabase ((_bstr_t)"DB");//设置默认数据库

pCommand.CreateInstance(__uuidof(Command));
pCommand->CommandTimeout = 5;
pCommand->ActiveConnection = pConnection;
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!/r/n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
Result=FALSE;
return Result;
}
_variant_t var;
float v1,v2,v3,v4;
CString Remark;
pRecordset.CreateInstance(__uuidof(Recordset));
try
{
pRecordset->Open("SELECT * FROM 表1",// 查询DemoTable表中所有字段
pConnection.GetInterfacePtr(),// 获取库接库的IDispatch指针
adOpenDynamic,
adLockOptimistic,
adCmdText);
while(!m_pRecordset->adoEOF)
{
var = m_pRecordset->GetCollect("v1");
if(var.vt != VT_NULL)
v1=var.fltVal;
// strName = (LPCSTR)_bstr_t(var);

var = m_pRecordset->GetCollect("v2");
if(var.vt != VT_NULL)
v2=var.fltVal;
var = m_pRecordset->GetCollect("v3");
if(var.vt != VT_NULL)
v3=var.fltVal;
var = m_pRecordset->GetCollect("v4");
if(var.vt != VT_NULL)
v4=var.fltVal;
var = m_pRecordset->GetCollect("remark");
if(var.vt != VT_NULL)
Remark = (LPCSTR)_bstr_t(var);
m_pRecordset->MoveNext();
}
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
Result=FALSE;
return Result;
}
return Result
hdg3707 2012-08-09
  • 打赏
  • 举报
回复
实际上单步执行就可以看到变量的值对不对,一般出问题时单步执行大多数都能发现问题.
hdg3707 2012-08-09
  • 打赏
  • 举报
回复
m_adoconn.OnInitADOConn("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Users\Administrator\\Desktop\\ado.mdb;Persist Security Info=False");
这么改,路径得加双斜杆

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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