導航:首頁 > 編程語言 > mfcado編程

mfcado編程

發布時間:2022-05-21 10:07:16

Ⅰ mfc 連接mysql ado和其他的區別

ODBC(Open DataBase Connection)開放式系統互連,是一種資料庫訪問協議,提供了訪問資料庫的API介面。基於ODBC的應用程序,對資料庫操作不依賴於具體的DBMS,不直接與DBMS打交道,所有資料庫操作由對應DBMS的ODBC驅動程序完成,即:系統中不需要安裝DBMS系統,如SQL SERVER 2005,但必須有SQL SERVER 2005的ODBC驅動程序,然後在ODBC管理器中注冊數據源後,就可以在應用程序中通過ODBC API訪問該資料庫。
ODBC資料庫訪問技術只適用於windows系統,因為需要在ODBC驅動程序管理器中進行數據源注冊,而只有windows才集成了ODBC驅動程序管理器(「控制面板/管理工具/數據源」)。
ADO(ActiveX Data Object)具有跨系統平台特性,它直接對DBMS資料庫進行操作,即系
統中必須有DBMS,但不需要驅動程序,不需要注冊數據源,所以具有很好的可移植性。
VC++6中這兩種技術所涉及到的MFC類:
MFC ODBC類包括CDatabase類 CRecordSet類 CRecoreView類 CFieldExchange類 CDBException類,具體說明請詳見任何一本講述資料庫編程技術的參考書。
ADO是data object,即數據對象的意思,先看一些它包括哪些常用對象:
Command對象 Connection對象 Error對象 RecordSet對象 Field對象 Parameter對象,對應到MFC ADO類,主要有_ConnectionPtr _RecordsetPtr等類。
基於ODBC和ADO的VC++應用程序設計概述
習慣上建立基於文檔視圖的應用程序時,使用ODBC訪問方法,創建應用程序時,需要在step 2 of 6 what database support would you like to include中選擇"database view with file support"載入你要訪問的資料庫,如果在此選擇None,後期編程載入資料庫相當麻煩,請注意。(如果一個資料庫中有多個表,可在此選擇一個表進行類定義,默認類名為"工程名+Set",可在應用程序創建完成前最後一步進行改名;然後在編程時建立其他基於CRecordSet的資料庫表類)
如果在step 2中設置訪問的資料庫和表,則在生成的應用程序框架的XXSet類中會自動載入對資料庫和表的連接訪問操作,當然你最好重新進行定義;系統只有在必要時才會調用GetDefaultConnection和GetDefaultSQL返回預設的資料庫連接定義和SQL語句。
當然也可以建立基於對話框的資料庫訪問應用程序,思路差不多,請讀者自行參悟。
習慣上當建立基於對話框的應用程序時,選擇使用ADO技術。對於小程序,在StdAfx.h中引入ADO動態連接庫,在C***APP中應初始化COM庫環境,創建和關閉ADO連接。對於大型項目,通過自定義的ADOConnection類封裝資料庫操作的各種介面。

Ⅱ mfc 資料庫編程 (odbc)

沒時間詳細說 給你個例子 有時間晚上交流
qq 469392501
void CMemoDBSDlg::OnBtnDelMember()
{
// TODO: Add your control notification handler code here
//獲取要刪除的成員記錄所在的行.
int nItem = m_listMember.GetNextItem(-1, LVNI_SELECTED);
if(nItem == -1){
AfxMessageBox("沒有選擇要刪除的成員");
return;
}
//獲取成員ID.
int id = atoi(m_listMember.GetItemText(nItem,0));
TRY{
CString sql;
//從資料庫中刪除記錄.
sql.Format("DELETE member_tab "
"where member_id = %d",id);
TRACE(sql);
m_db.ExecuteSQL(sql);
//從列表控制項中刪除該記錄.
m_listMember.DeleteItem(nItem);
}
CATCH(CDBException,ex)
{
AfxMessageBox (ex->m_strError);
AfxMessageBox (ex->m_strStateNativeOrigin);
}
AND_CATCH(CException,e)
{
TCHAR szError[100];
e->GetErrorMessage(szError,100);
AfxMessageBox (szError);
}
END_CATCH
}

void CMemoDBSDlg::OnBtnAddType()
{
// TODO: Add your control notification handler code here
//添加備注類型.
//初始化備注類型對話框實例.
CMemoTypeDlg dlg;
if(dlg.DoModal() == IDOK){
//從對話框中獲取新添加的備注類型.
CString strName = dlg.m_strTypeName;
TRY{
CRecordset rs(&m_db);
//獲取最大的類型ID值.
rs.Open(CRecordset::dynaset,
"Select max(TYPE_ID) from MEMO_TYPE_TAB");
//初始化新類型ID值為1.
int newTypeID = 1;
//如果資料庫已經有類型記錄,則新的類型ID為最大類型ID+1
if(!rs.IsEOF()) {
CDBVariant var;
rs.GetFieldValue((short)0, var, SQL_C_SLONG);
if (var.m_dwType != DBVT_NULL)
newTypeID = var.m_iVal + 1;
}
CString sql;
//向資料庫中添加新的備忘錄類型記錄.
sql.Format("Insert into MEMO_TYPE_TAB(TYPE_ID,"
"TYPE_NAME) "
"VALUES("
"%d,'%s')",newTypeID,strName);
TRACE(sql);
m_db.ExecuteSQL(sql);
//向界面中添加記錄行.
InsertMemoTypeItem(newTypeID,strName);
}
CATCH(CDBException,ex)
{
AfxMessageBox (ex->m_strError);
AfxMessageBox (ex->m_strStateNativeOrigin);
}
AND_CATCH(CException,e)
{
TCHAR szError[100];
e->GetErrorMessage(szError,100);
AfxMessageBox (szError);
}
END_CATCH
}

}

void CMemoDBSDlg::OnBtnModType()
{
// TODO: Add your control notification handler code here
//獲取要修改的類型記錄
int nItem = m_listType.GetNextItem(-1, LVNI_SELECTED);
//如果沒有選擇要修改的紀錄,返回.
if(nItem == -1){
AfxMessageBox("沒有選擇要修改的類型");
return;
}
//獲取要修改記錄的ID和名稱.
int id = atoi(m_listType.GetItemText(nItem,0));
CString name = m_listType.GetItemText(nItem,1);
//初始化備注類型對話框.
CMemoTypeDlg dlg;
//給對話框的變數賦值.
dlg.m_strTypeName = name;
if(dlg.DoModal() == IDOK){
//獲取修改後的數據.
CString strName = dlg.m_strTypeName;
TRY{
CString sql;
//更新記錄.
sql.Format("UPDATE MEMO_TYPE_TAB SET TYPE_NAME = '%s' "
" WHERE TYPE_ID = %d",strName,id);
TRACE(sql);
m_db.ExecuteSQL(sql);
//修改界面的值.
m_listType.SetItemText(nItem,1,strName);
}
CATCH(CDBException,ex)
{
AfxMessageBox (ex->m_strError);
AfxMessageBox (ex->m_strStateNativeOrigin);
}
AND_CATCH(CException,e)
{
TCHAR szError[100];
e->GetErrorMessage(szError,100);
AfxMessageBox (szError);
}
END_CATCH
}
}

void CMemoDBSDlg::OnBtnDelType()
{
// TODO: Add your control notification handler code here
//獲取要刪除的記錄所在的行.
int nItem = m_listType.GetNextItem(-1, LVNI_SELECTED);
//如果沒有選擇,返回.
if(nItem == -1){
AfxMessageBox("沒有選擇要刪除的類型");
return;
}
//獲取要刪除的類型ID
int id = atoi(m_listType.GetItemText(nItem,0));
TRY{
CString sql;
sql.Format("DELETE MEMO_TYPE_TAB "
"where TYPE_ID = %d",id);
TRACE(sql);
//刪除類型記錄
m_db.ExecuteSQL(sql);
//刪除界面中的記錄.
m_listType.DeleteItem(nItem);
}
CATCH(CDBException,ex)
{
AfxMessageBox (ex->m_strError);
AfxMessageBox (ex->m_strStateNativeOrigin);
}
AND_CATCH(CException,e)
{
TCHAR szError[100];
e->GetErrorMessage(szError,100);
AfxMessageBox (szError);
}
END_CATCH
}

void CMemoDBSDlg::OnBtnAddMemo()
{
// TODO: Add your control notification handler code here
//初始化備忘錄信息對話框.
CMemoInfoDlg dlg;
//獲取所有的家庭成員的名稱.
for(int i = 0 ; i < m_listMember.GetItemCount() ; i++ )
dlg.m_strMemberArray.Add(m_listMember.GetItemText(i,1)) ;
//獲取所有的類型信息.
for(i = 0 ; i < m_listType.GetItemCount() ; i++ )
dlg.m_strTypeArray.Add(m_listType.GetItemText(i,1)) ;
//打開對話框,添加新的記錄.
if(dlg.DoModal() == IDOK){
//從對話框中獲取記錄值.
CString strName = dlg.m_strMember;
CString strType = dlg.m_strMemoType;
CString strHappenDate = dlg.m_oleDate.Format("%Y-%m-%d")
+ " " + dlg.m_oleTime.Format("%H:%M:%S");
CString strOperDate = COleDateTime::GetCurrentTime().Format("%Y-%m-%d %H:%M:%S");
int isEvent = dlg.m_isEvent;
CString strCost = dlg.m_strCost;
CString strMemo = dlg.m_strMemoInfo;
TRY{
CRecordset rs(&m_db);
CString sql;
//根據成員姓名獲取成員ID值.
sql.Format("Select MEMBER_ID from MEMBER_TAB where "
"MEMBER_NAME = '%s'",strName);
rs.Open(CRecordset::dynaset,sql);
int memberID = 1;
if(!rs.IsEOF()) {
CDBVariant var;
rs.GetFieldValue((short)0, var, SQL_C_SLONG);
if (var.m_dwType != DBVT_NULL)
memberID = var.m_iVal;
}
rs.Close();
//根據備忘錄類型獲取備忘錄類型ID.
sql.Format("Select TYPE_ID from MEMO_TYPE_TAB where "
"TYPE_NAME = '%s'",strType);
rs.Open(CRecordset::dynaset,sql);
int typeID = 1;
if(!rs.IsEOF()) {
CDBVariant var;
rs.GetFieldValue((short)0, var, SQL_C_SLONG);
if (var.m_dwType != DBVT_NULL)
typeID = var.m_iVal;
}
rs.Close();
//從SEQ_MEMO_ID序列中獲取下一個值.這個值就是新的備忘錄ID.

rs.Open(CRecordset::dynaset,
"Select max(MEMO_ID) from MEMO_INFO_TAB");

int memoID = 1;
if(!rs.IsEOF()) {
CDBVariant var;
rs.GetFieldValue((short)0, var, SQL_C_SLONG);
if (var.m_dwType != DBVT_NULL)
memoID = var.m_iVal+1;
}

sql.Format("Insert into MEMO_INFO_TAB(MEMO_ID,"
"MEMBER_ID,OPER_DATE,HAPPEN_DATE,"
"IS_BIGEVENT,EVENT_COST,TYPE_ID,MEMO_TEXT) "
"VALUES("
"%d,%d,'%s'"
",'%s',%d,'%s'"
",%d,'%s')",memoID,memberID,
strOperDate,strHappenDate,isEvent,strCost,typeID,strMemo);
TRACE(sql);

m_db.ExecuteSQL(sql);
//向界面中插入新的紀錄.
InsertMemoInfoItem(memoID,strName,strOperDate,strHappenDate,isEvent,strCost,strType,strMemo) ;
}
CATCH(CDBException,ex)
{

AfxMessageBox (ex->m_strError);
AfxMessageBox (ex->m_strStateNativeOrigin);
}
AND_CATCH(CException,e)
{

TCHAR szError[100];
e->GetErrorMessage(szError,100);
AfxMessageBox (szError);
}
END_CATCH
}
}

Ⅲ 請教:MFC多線程資料庫編程ado,資料庫訪問沖突。

用多線程同步技術,即一個線程將要取得數據區鎖定,另一個線程此時不能存取此塊的數據。
看看多線程同步的書。

例如:
void CCalibPage1::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
UpdateData();

m_nCounter++;

double r;

CSingleLock sLock(&(gpMainFrm->m_mutex));
sLock.Lock();//此處鎖定
double v = gSpindleRevolution;
sLock.Unlock();//存取後釋放。

if(m_bCalibStart)
{
r = m_CalibValue/v;

m_szTestValue0.Format("%f",v);
// m_szTestValue.Format("%f", (v * r));
m_szRatio.Format("%f", r);//
UpdateData(false);
}
else if(m_bVerify)
{
m_szTestValue.Format("%f",v*gcConfig.calib[PCL833_CHANNEL].ratio);
UpdateData(false);
}

if(m_nCounter > 30)
{
KillTimer(11);
m_bCalibStart = false;
m_bVerify = false;
MessageBox(_T("標定完成!"),_T("CNCTest"));
UpdateButtonStatus();
}

CPropertyPage::OnTimer(nIDEvent);
}

參見:
http://ke..com/view/2808915.htm

Ⅳ ADO+MFC資料庫編程時,修改記錄和插入記錄的代碼各條語句的意思

1. // 這個Open函數的第二個參數為什麼和
答:你這里不都是一樣的嗎?

2.m_pRecordset->AddNew(); //為什麼要這一句呢?是提示程序要添加新的記錄了嗎?
答:不是提示,這個是讓表添加一個新行。

3.m_pRecordset->PutCollect("name", _variant_t(m_Name)); // 這里的PutCollect函數的作用是什麼?
答:put 放入的意思。這里是把m_Name值放入表中的name欄位中。

4.m_pRecordset->MoveFirst(); // 這一句和下面的Move有什麼作用??
答:m_pRecordset表示記錄集。MoveFirst移動指針到記錄集中的第一行。
Move(cursel);移動到cursel)行。

5.m_pRecordset->PutCollect("age", atol(m_Age)); //為什麼這里的強制轉換是用atol,而不是用上面的_variant_t ???
答:因為在表中聲明的age是long類型。放入數據時類型要一致。

Ⅳ 怎樣在MFC編程中使用microsoft SQL server 2008建立資料庫鏈接

為什麼一定要選2008?安裝sql server 2008需要首先將visual studio 2008升級到sp1,否則無法安裝的。
建議使用sql server 2005。這個版本有完全版的--兩張光碟的,第一張是伺服器,第二張是managerment studio--也就是圖形化操作資料庫的界面。
你就裝express版吧,這個版本有兩張光碟的,沒有的話就去電驢上下載。
連接資料庫的話直接網路一下mfc ado編程。是在是漫天都是。
如果你不是很熟悉sql server,可以用ado讀寫mdb也就是access來練練手。對mfc而言,不管是access資料庫,還是sql server,操作ado的語句都是一樣的,不同點只是在資料庫引擎關鍵字上。

Ⅵ 我在用MFC編程,如何寫代碼能修改access資料庫中的數據

通過ado與access數據進行連接,然後執行sql 語句就可以操作資料庫了。下面的鏈接是個簡單例子:
http://dev.yesky.com/243/2230743.shtml

Ⅶ MFC編程用ADO連接資料庫,執行查詢語句後,如果返回0條記錄有什麼標志嗎

if ((m_pRecordset->BOF)||(m_pRecordset->adoEOF))
{
// AfxMessageBox("沒有記錄");
return;
}

Ⅷ 關於編程和資料庫!MFC(C++)

如果你的系統是在windows平台下的話,sqlserver肯定是不需要裝驅動就能用的,當然如果你用資料庫肯定需要安裝相應的資料庫軟體,不然,根本沒有庫,你程序連接什麼呢?是可以通過程序語言來控制資料庫的寫入,刪除的,這個和標準的sql語句沒有差別,你只需要會用就可以了,一般在windows平台線面訪問數據的操作可以使用ado 和一些資料庫控制項,比如說datagrid

Ⅸ 關於資料庫與Mfc的鏈接

資料庫編程的思路都是一致的:打開資料庫連接-》執行SQL語句-》獲得查詢結果-》關閉資料庫連接,不同的資料庫訪問技術有不同的要求,比如用C API詰問MySql資料庫的時候還得釋放查詢結果集。
ODBC訪問資料庫得配置數據源

配置ODBC數據源:打開控制面板下的「數據源」,彈出「ODBC數據源管理器」,選擇DSN選項卡-》添加->你選擇你的SQL Server選項,單擊完成。如圖然後你再按照向導提示添加。

代碼中用ODBC訪問資料庫你得加上afxdb.h頭文件,
用CDataBase 類連接資料庫、CRecordSet類查詢記錄。
現在在VC訪問資料庫常用的是ADO訪問,你可以找一下我前面的回答有ADO訪問資料庫的步驟。

CDataBase m_cODBCDb;
用CDataBase類的OpenEx()函數打開資料庫連接。連接字元串你自己構造一下。
定義一個與上面資料庫相關的查詢對象
CRecordSet m_cODBCRec(&m_cODBCDb);
用這個查詢對象的open方法就可以執行SQL語句與資料庫交互了;

現在用VC、MFC訪問資料庫常用的技術是ADO,學學這個吧。難點、但很實用!

導入ADO庫
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "adoEOF")
2、用導入的動態庫的指針操作資料庫.
打開資料庫連接
_ConnectionPtr m_pConn; // 資料庫連接指針
// 創建Conneciton對象
m_pConn.CreateInstance(_T("ADODB.Connection"));
用ConnectionPtr 的open方法m_pConn->Open(_bstr_t(m_sConn),
_T(""), _T(""), lOptions));
m_sConn為你連接資料庫的信息,你應該按照你的要求打開資料庫

然後你用打開的那個連接進行操作資料庫。比如
_RecordsetPtr pRec = m_pConn->Execute(_bstr_t(pszSql), NULL, CmdText);
pszSql 就你要操作資料庫的SQL語句。在這個SQL語句里你可以創建表、更新表等。

用ADO訪問的時候要求初始他COM庫和釋放COM對象
// 初始化COM環境(庫)
::CoInitialize(NULL);
//釋放COM對象
::CoUninitialize();

Ⅹ mfc編程用的c++,然後想實現和Oracle的連接。

可以通過VC++ ADO訪問ORACLE,以前做過,是肯定可行的。

看看下面這個連接對你有沒有幫助:
http://www.cnblogs.com/doublesnke/archive/2011/07/19/2110328.html

lpszConnect="Provider=OraOLEDB.Oracle;User ID=system;Password=sys;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1,122)(PORT=1521)))(CONNECT_DATA=(SID=orcl)))";

這樣的一長串連接字元串可以通過新建一個udl文件設置測試連接成功後,載入獲得。

閱讀全文

與mfcado編程相關的資料

熱點內容
生意不忙怎麼解壓 瀏覽:500
歡太健康app在哪裡下載 瀏覽:488
androidtools使用教程 瀏覽:971
十天突破雅思口語pdf劍9 瀏覽:295
李誕笑場pdf 瀏覽:265
自用紙巾做解壓筆 瀏覽:129
銀行流水解壓碼是多少 瀏覽:895
百度哪個app好用 瀏覽:316
115廣告聯盟源碼 瀏覽:494
聯通app簽到源碼 瀏覽:680
怎麼連接另一個伺服器的資料庫 瀏覽:742
貓盤洗白命令 瀏覽:844
168api源碼 瀏覽:967
不同地方的文件伺服器如何通信 瀏覽:599
自己電腦上搭建ftp伺服器地址 瀏覽:977
程序員的秋招秘籍 瀏覽:821
單片機國內外研究現狀 瀏覽:308
gta5如何進千人真實伺服器 瀏覽:996
電腦html壁紙源碼 瀏覽:726
c語言返回命令 瀏覽:933