vs2013建立MFC專案通過ODBC連線mysql資料庫
阿新 • • 發佈:2019-02-11
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
相關材料: