mfc连接access数据库
⑴ MFC做的登录界面连接access数据库
刚刚写了个access的系统
.cpp中
//hxx函数主要用于打开数据库连接
void ADOConn::OnInitADOConn()
{
::CoInitialize(NULL); //why初始化OLE/COM库环境
try
{
m_pCon.CreateInstance("ADODB.Connection"); //创建Connection对象
m_pCon->ConnectionTimeout=3; //设置连接延时
//设置连接字符串why
//m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=InfoMan.mdb","","",adModeUnknown);
m_pCon->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=InfoMan.mdb;Persist Security Info=False;Jet OLEDB:Database Password=1234","","",adModeUnknown); }
catch(_com_error e) //捕获异常
{
AfxMessageBox(e.Description()); //显示错误信息
}
}
.h中
#import "G:\\MY_PRO\\InfoMan\\msado15.dll"no_namespace\
rename("EOF","adoEOF")
_ConnectionPtr m_pCon; //添加一个指向Connection对象的指针
_RecordsetPtr m_pRs; //添加一个指向Recordset对象的指针
⑵ mfc中如何连接access数据库 求详细步骤
比如在你的工程目录中建一个 dbfvir.mdb //Access数据库,然后你需要做以下操作:
1.在StadAfx.h里面添加#include <afxdb.h> //新加入头文件,用于CDatabase类。
2.在StadAfx.h最后的#endif上添加#import "msado15.dll" no_namespace rename("EOF","rsEOF")
这时,你要把msado15.dll拷到与dbf同级的目录,也就是工程目录里,当然你可以该路径
3.在你自己的工程里,比如MyProc是你建的工程,添加代码
CMyPorcApp::CMyProcApp(){
CoInitialize(NULL);
SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)",
"DSN=MyImage;DBQ=dbf\vir.mdb;DEFAULTDIR=dbf"); //注册本地数据库数据源
m_db.OpenEx("DSN=MyImage;;",CDatabase::noOdbcDialog);//MyImage是数据源名称
}
4.在前面的函数体之前创建全局变量CDatabase m_db; CRecordset m_rec(&m_db);
5.使用数据库{
CString strSQL="select * from virdb";
BSTR bstrSQL=strSQL.AllocSysString();
m_rec.Open(CRecordset::dynaset,strSQL);
while(!m_rec.IsEOF())
{
// 使用数据库的代码,读出来的数据都是字符串型的
CString MyVirable;
m_rec.GetFieldValue("字段名",MyVirable); //将某个字段的当前行的值读到MyVirabl中
// ......
m_rec.MoveNext(); //将记录移到下一行
}
}
本程序是自动注册数据源的,当然可以手动注册数据源,关于如何注册数据源并不麻烦,叙述起来不太方面,你就参考其他的吧。不过建议不用手动注册数据源,这样你地程序移植性不好.
⑶ (高分)在MFC工程中用ADO方法连接Access数据库,如何实现将查询的记录集导入Excel文件中
给你一段代码,我一个程序中用到的通过ADO将记录写入EXCEL并保存。
你自己挑挑里面有用的部分。应该能看懂吧。
UpdateData(TRUE);
SetDlgItemText(IDC_STATIC11, "条件选择");
if(m_list2.GetCurSel()==-1||m_list4.GetCurSel()==-1||m_list5.GetCurSel()==-1)
{
AfxMessageBox("请将条件选择完整!");
return;
}
if(m_check1)
{
if(m_list6.GetCurSel()==-1)
{
AfxMessageBox("请选择B表中某列作为拷贝源!");
return;
}
}
_ConnectionPtr m_pConnection1 = NULL;
_ConnectionPtr m_pConnection2 = NULL;
_RecordsetPtr m_pRecordset = NULL;
// CString m_SinFile;
// CString m_TableName;
long lFiledCount1 = 0;
long lFiledCount2 = 0;
long lRowCount1 = 0; // 表的记录数目,不包括表格的表头行
long lRowCount2 = 0; // 表的记录数目,不包括表格的表头行
long lRowIndex2 = 0;
CoInitialize(NULL);
m_pConnection1.CreateInstance("ADODB.Connection");
m_pConnection2.CreateInstance("ADODB.Connection");
m_pRecordset.CreateInstance("ADODB.Connection");
CString strText1;
m_list1.GetLBText(m_list1.GetCurSel(),strText1);
CString SQLstr1;
SQLstr1.Format("SELECT * FROM [%s$]",strText1);
CString strText2;
m_list2.GetLBText(m_list2.GetCurSel(),strText2);
CString SQLstr2;
SQLstr2.Format("SELECT * FROM [%s$]",strText2);
try
{
SetDlgItemText(IDC_STATIC12, "正在标记,耐心等候...");
//打开excel文件
m_pConnection1->Open((_bstr_t)path1,"","",adModeUnknown);
m_pConnection2->Open((_bstr_t)path2,"","",adModeUnknown);
_RecordsetPtr pRecordset1;
_RecordsetPtr pRecordset2;
pRecordset1.CreateInstance (__uuidof(Recordset));
pRecordset2.CreateInstance (__uuidof(Recordset));
try
{
// [Feature$]代表Excel表格的某个工作表的名称
pRecordset1->Open(_variant_t(SQLstr1), // 查询DemoTable表中所有字段
m_pConnection1.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenStatic,//adOpenDynamic,adOpenKeyset
adLockOptimistic,
adCmdText);
pRecordset2->Open(_variant_t(SQLstr2), // 查询DemoTable表中所有字段
m_pConnection2.GetInterfacePtr(), // 获取库接库的IDispatch指针
adOpenStatic,//adOpenDynamic,adOpenKeyset
adLockOptimistic,
adCmdText);
CString lb3; //A表某工作簿子集的全部子字段标题
CString lb4; //B表某工作簿子集的全部子字段标题
CString lb5;
CString lb6;
int p1=0; //A表需对比列的索引位置
int p2=0; //B表需对比列的索引位置
int p3=0;
m_list3.GetLBText(m_list3.GetCurSel(),lb3);
m_list4.GetLBText(m_list4.GetCurSel(),lb4);
m_list5.GetLBText(m_list5.GetCurSel(),lb5);
m_list6.GetLBText(m_list5.GetCurSel(),lb6);
//得到字段数目
lFiledCount1 = pRecordset1->GetFields()->GetCount();
lFiledCount2 = pRecordset2->GetFields()->GetCount();
//得到记录条数
lRowCount1 = pRecordset1->GetRecordCount();
lRowCount2 = pRecordset2->GetRecordCount();
//获取字段名
_bstr_t *filedName1 = new _bstr_t[lFiledCount1]; // 存储字段名
_bstr_t *filedName2 = new _bstr_t[lFiledCount2]; // 存储字段名
for (int filedIndex1 = 0;filedIndex1 < lFiledCount1;filedIndex1++)
{
filedName1[filedIndex1] = pRecordset1->GetFields()->GetItem(_variant_t(long(filedIndex1)))->GetName();
if(lb3==(LPCSTR)filedName1[filedIndex1])
{
p1=filedIndex1;
}
if(lb6==(LPCSTR)filedName1[filedIndex1])
{
p3=filedIndex1;
}
}
// FieldsPtr fds=pRecordset1->GetFields();
// fds->Append("S_id",adTinyInt,NULL,adFldRowID);
for (int filedIndex2 = 0;filedIndex2 < lFiledCount2;filedIndex2++)
{
filedName2[filedIndex2] = pRecordset2->GetFields()->GetItem(_variant_t(long(filedIndex2)))->GetName();
if(lb4==(LPCSTR)filedName2[filedIndex2])
{
p2=filedIndex2;
}
}
long lRowIndex1 = 0;
CString str1; // 存储表格中的所有数据
CString str2; // 存储表格中的所有数据
int flag=m_list5.FindString(-1,m_liststr5);
m_progress1.SetRange(0,lRowCount1);
pRecordset1->MoveFirst();
while(!pRecordset1->adoEOF)
{
// 按行,然后对每条数据的各个字段进行存储
str1 = VariantToString(pRecordset1->GetFields()->GetItem(_variant_t(filedName1[p1]))->Value);
pRecordset2->MoveFirst();
while(!pRecordset2->adoEOF)
{
// 按行,然后对每条数据的各个字段进行存储
str2 = VariantToString(pRecordset2->GetFields()->GetItem(_variant_t(filedName1[p2]))->Value);
if(str1==str2)
{
_variant_t t = _variant_t(long(flag));
pRecordset1->PutCollect(&t,_variant_t(m_eFlagStr));
lRowIndex2++;
pRecordset1->Update();
}
pRecordset2->MoveNext();
}
pRecordset1->MoveFirst();
lRowIndex1++;
m_progress1.SetPos(lRowIndex1);
pRecordset1->Move(lRowIndex1);
}
//pMyCom->Release();
pRecordset1->Close();
pRecordset1.Release();
pRecordset1 = NULL;
pRecordset2->Close();
pRecordset2.Release();
pRecordset2 = NULL;
m_pConnection1->Close();
m_pConnection2->Close();
if (filedName1 != NULL)
{
delete []filedName1;
filedName1 = NULL;
}
if (filedName2 != NULL)
{
delete []filedName2;
filedName2 = NULL;
}
}
catch(_com_error e)
{
EndWaitCursor();
AfxMessageBox(e.Description());
SetDlgItemText(IDC_STATIC12, "处理失败!");
}
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
EndWaitCursor();
return;
SetDlgItemText(IDC_STATIC12, "处理失败!");
}
CString num;
num.Format("完成标记%d条记录!",lRowIndex2);
SetDlgItemText(IDC_STATIC12, num);