1. 程式人生 > >vs2013建立MFC專案通過ODBC連線mysql資料庫

vs2013建立MFC專案通過ODBC連線mysql資料庫

1.用ODBC連線mysql

右鍵空白部分-》類嚮導-》新增類-》MFC ODBC使用者-》資料來源-》機器資料來源-》新建-》使用者資料源(點選下一步)-》Mysql ODBC Unicode Driver-》完成

出現下圖:

填寫資料,點選test。連線成功選擇OK。

再選擇你剛填寫的資料庫,點選OK;出現下圖,選擇你要連線的表,確定,完成

出現該錯誤(fatal error C1189: #error :  安全問題:連線字串可能包含密碼。)請//

2.程式碼1

說明1:LG.nID是char陣列;pSet是在CxxxDlg.h的類中加入資料庫類例項

說明2:下面這種方法只用於查詢(select)

if (pSet->IsOpen())
pSet->Close();
//如果記錄集開啟,則先關閉
CString temp(LG.nID);
pSet->m_strFilter.Format(L"id='%s'",temp);//相當於where後面的條件
//id是usres表的欄位名,用來指定查詢條件
pSet->Open();//裡面沒有引數就使用m_strFilter;有引數就不能有m_strFilter
if (!pSet->IsEOF()) // 如果開啟記錄集有記錄 
{
//pSet.GetFieldValue( L"password" , varPassword );
//pSet.MoveNext();
//MessageBox(L"找到賬號");if (pSet->m_password == LG.nPWD){//執行程式碼}else{//執行程式碼}}else{//執行程式碼}

程式碼2:
說明:用於插入、更新、刪除

CString query;
query.Format(L"insert into users values (\"%s\",\"%s\");", id, password); 
CDatabase db;
Cusers sj;//Cusers是odbc生成的資料庫類名
CString lj = sj.GetDefaultConnect();
if (!db.IsOpen())//判斷資料庫是否已經被開啟
{
BOOL bflag = db.Open(NULL, false, false, lj);//連線資料庫
if (!bflag)
{
MessageBox(L"開啟資料庫失敗!\n請重啟!");
return;
}
}
try
{
db.ExecuteSQL(query);
}
catch (CDBException *e)
{
e->ReportError();  //報告異常原因,如主鍵異常
e->Delete();
db.Close();
return;
}
catch (CMemoryException *e)
{
MessageBox(L"資料庫記憶體異常!");
e->Delete();
return;
}
catch (...)
{
MessageBox(L"資料庫其它異常!");
return;
}
db.Close();


問題:odbc不支援動態集等:


修改open()第一個引數。
定義CRecordset物件,呼叫其Open方法開啟記錄集,如 
CRecordset rs(&m_db); 
virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none); 
引數一為開啟型別,如下: 
AFX_DB_USE_DEFAULT_TYPE:預設值 
CRecordset::dynaset:動態記錄集,支援雙向遊標,並保持同所連線的資料來源同步,對資料的更新操作可以通過一個fetch操作獲取。 
CRecordset::snapshot:靜態快照,一旦形成記錄集,此後資料來源的所有改變都不能體現在記錄集裡,應用程式必須重新進行查詢,才能獲取對資料的更新。該型別記錄集也支援雙向遊標。 
CRecordset::dynamic:同CRecordset::dynaset記錄集相比,CRecordset::dynamic記錄還能在fetch操作裡同步其它使用者對資料的重新排序,大部分ODBC驅動程式不支援這種記錄集 。
CRecordset::forwardOnly:除了不支援逆向遊標外,其它特徵同CRecordset::snapshot相同。 

引數二為sql查詢語句,查詢結果儲存在記錄集中 

引數三指定建立記錄集時的常用選項 
CRecordset::none:無選項(預設),與其它所有選項互斥,可以更新、刪除、新增記錄 
CRecordset::appendOnly:不允許修改和刪除記錄,但可以新增記錄. 
CRecordset::readOnly:記錄集是隻讀的.


**錯誤**:“MFC internal error: unable to load error string from resource.”
說明mfc中連線了多張表,其中某些表缺少 virtual BOOL Requery();和virtual BOOL Open(UINT nOpenType = snapshot, LPCTSTR lpszSql = NULL, DWORD dwOptions = none);
解決方法:VS中某一張表-》類嚮導-》虛擬函式-》新增 Requery和Open
相關材料: