㈠ 請教: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
㈡ 如何進行MFC資料庫編程
MFC資料庫編程包含如下:
首先,你要選擇使用什麼方式連接資料庫,有ODBC,ADO等,
其他,就是sql語句操作資料庫了,對後是怎麼存儲操作數據。
㈢ 資料庫編程用ADO好,還是ODBC好
這要看具體情況,如果對資料庫的底層訪問很看重,則用ODBC,如果只是需要一個資料庫的介面,而具體細節不是很重要的話,則用ADO。大多數情況下,使用ADO。
ODBC:
直接使用ODBC API編寫應用程序需要編制大量代碼,Visual C++提供了MFC ODBC類,其中封裝了ODBC API,因此,使用MFC來創建ODBC的應用程序非常簡便。主要的MFC ODBC類如下所示。
CDatabase類:一個CDatabase對象表示一個到數據源的連接,通過它可以操作數據源。應用程序可使用多個CDatabase對象,構造一個對象並調用OpenEx()成員函數打開一個連接。接著構造CRecordSet對象以操作連接的數據源,並向 CDatabase對象傳遞記錄集構造程序指針。完成後用Close()成員函數銷毀CDatabase對象。一般情況下並不需要直接使用CDatabase對象,因為CRecordSet對象可以實現大多數的功能。但是在進行事務處理時,CDatabase就起到關鍵作用。事務(Transaction)指的是將一系列對數據源的更新放在一起,同時提交或一個也不提交,為的是確保多用戶對數據源同時操作時的數據正確性。
CRecordSet類:一個CRecordSet對象代表一個從數據源選擇的一組記錄的集合——記錄集。記錄集有兩種形式,snapshot和dynaset,前者表示數據的靜態試圖,後者表示記錄集和其他用戶對資料庫的更新保持同步。通過CRecordSet對象,用戶可以對資料庫中的記錄進行各種操作。
CRecordView類:CRecordView對象是在空間中顯示資料庫記錄的視圖。這種視圖是一種直接連到CRecordSet對象的格式視圖,它從一個對話框模板資源創建,並將CRecordSet對象的欄位顯示在對話框模板的控制項中。對象利用DDX和RFX機制,使格式上的控制項和記錄集的欄位之間數據移動自動化,也就是說,用戶不用編寫一行代碼就可以實現簡單的資料庫記錄查看操作。
CDBException:由Cexception類派生,以3個繼承的成員變數反映對資料庫操作時的異常。
m_nRetCode:以ODBC返回代碼(SQL_RETURN)的形式表明造成異常的原因。
m_strError:字元串,描述造成拋出異常的錯誤原因。
m_strStateNativeOrigin:字元串,用以描述以ODBC錯誤代碼表示的異常錯誤。
MFC資料庫類成員函數都能拋出CDBException類型異常,所以在代碼對資料庫進行操作後監測異常是正確的做法。
ADO:
ADO技術是基於OLE DB的訪問介面,它繼承了OLE DB技術的優點,並且,ADO對OLE DB的介面作了封裝,定義了ADO對象,使程序開發得到簡化。ADO技術屬於資料庫訪問的高層介面。ADO基於COM,提供編程語言可利用的對象,除了面向VC++,還提供面向其他各種開發工具的應用,如VB、VJ等。ADO在伺服器應用方面非常有效,特別是對於動態伺服器頁面(ASP,Active Server Page)的支持。
ADO對象結構類似於OLE DB,但並不依靠對象層次。大多數情況下,用戶只需要創建並使用需要處理的對象。ADO 最主要的優點是易於使用、速度快、內存支出少和磁碟遺跡小。ADO 在關鍵的應用方案中使用最少的網路流量,並且在前端和數據源之間使用最少的層數,所有這些都是為了提供輕量、高性能的介面。下面的對象類組成了ADO介面。
Connection:用於表示與資料庫的連接,以及處理一些命令和事務。
Command:用於處理傳送給數據源的命令。
Recordset:用於處理數據的表格集,包括獲取和修改數據。
Field:用於表示記錄集中的列信息,包括列值和其他信息。
Parameter:在傳送給數據源的命令之間傳遞數據。
Property:用於操作在ADO中使用的其他對象的詳細屬性。
Error:用於獲得可能發生的詳細錯誤信息。
㈣ MFC編程用ADO連接資料庫,執行查詢語句後,如果返回0條記錄有什麼標志嗎
if ((m_pRecordset->BOF)||(m_pRecordset->adoEOF))
{
// AfxMessageBox("沒有記錄");
return;
}
㈤ 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類型。放入數據時類型要一致。