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);