mfc操作資料庫
Ⅰ [轉載]MFC 如何連接資料庫(c++ 連接sql server )老
1.首先,你的機器上要保證有sql server,並能正確進入並創建資料庫,表等。2.建議把那個SA的密碼自己重新設定一下,設定方法:打開sql server 2005 SQL Server Management Studio,進去後在那個安全性--登錄名--右鍵點擊SA屬性,設置密碼,狀態裡面改成,授予 啟用。3.將ADO代碼庫引入到工程中,需要在stdafx.h或TEST.h(這個MFC項目的頭文件)中添加如下代碼,注意不同的操作系統在安裝時這個路徑可能不一樣,所以必須先在系統中找到msado15.dll文件的路徑:加入代碼:#import "C:Program FilesCommon FilesSystemadomsado15.dll" no_namespace rename("EOF","adoEOF")?(通過以上代碼就可以將ADO代碼庫引入到當前工程中)?4.在TEST工程中的TEST.h中加入如下代碼:(藍色為所加入的) class CSQL_TESTApp : public CWinApp{public:?_ConnectionPtr m_pAppConn;?//連接對象指針
CString m_AppConnString;?//連接字元串的聲明
bool m_bConnected; //連接標志 public:
CSQL_TESTApp();// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSQL_TESTApp)public:virtual BOOL InitInstance();
。。。。};?5.在TEST工程的TEST.CPP文件中加入如下代碼:(藍色為所加入的)BOOL CSQL_TESTApp::InitInstance(){AfxEnableControlContainer();?HRESULT hRes;try{hRes=m_pAppConn.CreateInstance(_T("ADODB.Connection"));
m_pAppConn->Open(_bstr_t((LPCTSTR) m_AppConnString) , _T("") , _T("") , adModeUnknown);
if(SUCCEEDED(hRes)){m_bConnected = TRUE; //連接成功設置標志位}}catch(_com_error e){CString errormessage;
errormessage.FormatMessage(_T("連接資料庫失敗 %s"),e.ErrorMessage());
AfxMessageBox(errormessage); //顯示錯誤信息
return FALSE;?}
Ⅱ MFC操作資料庫有關的類
1、 MFC的ODBC類簡介
MFC的ODBC類對較復雜的ODBC API進行了封裝,提供了簡化的調用介面,從而大大方便了資料庫應用程序的開發。程序員不必了解ODBC API和SQL的具體細節,利用ODBC類即可完成對資料庫的大部分操作。
MFC的ODBC類主要包括:
CDatabase類:主要功能是建立與數據源的連接。
CRecordset類:該類代表從數據源選擇的一組記錄(記錄集),程序可以選擇數據源中的某個表作為一個記錄集,也可以通過對表的查詢得到記錄集,還可以合並同一數據源中多個表的列到一個記錄集中.通過該類可對記錄集中的記錄進行滾動、修改、增加和刪除等操作。
CRecordView類:提供了一個表單視圖與某個記錄集直接相連,利用對話框數據交換機制(DDX)在記錄集與表單視圖的控制項之間傳輸數據。該類支持對記錄的瀏覽和更新,在撤銷時會自動關閉與之相聯系的記錄集。
CFieldExchange類:支持記錄欄位數據交換(DFX),即記錄集欄位數據成員與相應的資料庫的表的欄位之間的數據交換。該類的功能與CDataExchange類的對話框數據交換功能類似。
CDBException類:代表ODBC類產生的異常。
概括地講,CDatabase針對某個資料庫,它負責連接數據源;CRecordset針對數據源中的記錄集,它負責對記錄的操作;CRecordView負責界面,而CFieldExchange負責CRecordset與數據源的數據交換。
利用AppWizard和ClassWizard,用戶可以方便地建立資料庫應用程序,但這並不意味著可以對MFC的ODBC類一無所知.讀者應注意閱讀後面幾小節中的內容,為學習後面的例子打好基礎.
2、 CDatabase類
要建立與數據源的連接,首先應構造一個CDatabase對象,然後再調用CDatabase的Open成員函數.Open函數負責建立連接,其聲明為
virtual BOOL Open( LPCTSTR lpszDSN, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = 「ODBC;」, BOOL bUseCursorLib = TRUE ); throw( CDBException, CMemoryException );
參數lpszDSN指定了數據源名(構造數據源的方法將在後面介紹),在lpszConnect參數中也可包括數據源名,此時lpszDSN必需為 NULL,若在函數中未提供數據源名且使lpszDSN為NULL,則會顯示一個數據源對話框,用戶可以在該對話框中選擇一個數據源.參數 bExclusive說明是否獨占數據源,由於目前版本的類庫還不支持獨占方式,故該參數的值應該是FALSE,這說明數據源是被共享的.參數 bReadOnly若為TRUE則對數據源的連接是只讀的.參數lpszConnect指定了一個連接字元串,連接字元串中可以包括數據源名、用戶帳號 (ID)和口令等信息,字元串中的"ODBC"表示要連接到一個ODBC數據源上.參數bUseCursorLib若為TRUE,則會裝載游標庫,否則不 裝載,快照需要游標庫,動態集不需要游標庫. 若連接成功,函數返回TRUE,若返回FALSE,則說明用戶在數據源對話框中按了Cancel按鈕。若函數內部出現錯誤,則框架會產生一個異常。
下面是一些調用Open函數的例子。
CDatabase m_db; //在文檔類中嵌入一個CDatabase對象
//連接到一個名為"Student Registration"的數據源
m_db.Open("Student Registration");
//在連接數據源的同時指定了用戶帳號和口令
m_db.Open(NULL,FALSE,FALSE,"ODBC;DSN=Student Registration;UID=ZYF;PWD=1234");
m_db.Open(NULL); //將彈出一個數據源對話框
要從一個數據源中脫離,可調用函數Close。在脫離後,可以再次調用Open函數來建立一個新的連接.調用IsOpen可判斷當前是否有一個連接,調用GetConnect可返回當前的連接字元串。函數的聲明為
virtual void Close( );
BOOL IsOpen( ) const; //返回TRUE則表明當前有一個連接
const CString& GetConnect( ) const;
CDatabase的析構函數會調用Close,所以只要刪除了CDatabase對象就可以與數據源脫離。
3、CRecordset類
CRecordset類代表一個記錄集.該類是MFC的ODBC類中最重要、功能最強大的類。
10.5.1 動態集、快照、游標和游標庫
在多任務操作系統或網路環境中,多個用戶可以共享同一個數據源。共享數據的一個主要問題是如何協調各個用戶對數據源的修改。例如,當某一個應用改變了數 據源中的記錄時,別的連接至該數據源的應用應該如何處理。對於這個問題,基於MFC的ODBC應用程序可以採取幾種不同的處理辦法,這將由程序採用哪種記 錄集決定。
記錄集主要分為快照(Snapshot) 和動態集(Dynaset)兩種,CRecordset類對這兩者都支持。這兩種記錄集的不同表現在它們對別的應用改變數據源記錄採取了不同的處理方法。
快照型記錄集提供了對數據的靜態視.快照是個很形象的術語,就好象對數據源的某些記錄照了一張照片一樣.當別的用戶改變了記錄時(包括修改、添加和刪 除),快照中的記錄不受影響,也就是說,快照不反映別的用戶對數據源記錄的改變.直到調用了CRecordset::Requery重新查詢後,快照才會 反映變化.對於象產生報告或執行計算這樣的不希望中途變動的工作,快照是很有用的。需要指出的是,快照的這種靜態特性是相對於別的用戶而言的,它會正確反 映由本身用戶對記錄的修改和刪除,但對於新添加的記錄直到調用Requery後才能反映到快照中.
動態集提供了數據的動態視.當別的用戶修改或刪除了記錄集中的記錄時,會在動態集中反映出來:當滾動到修改過的記錄時對其所作的修改會立即反映到動態集 中,當記錄被刪除時,MFC代碼會跳過記錄集中的刪除部分.對於其它用戶添加的記錄,直到調用Requery時,才會在動態集中反映出來。本身應用程序對 記錄的修改、添加和刪除會反映在動態集中。當數據必須是動態的時侯,使用動態集是最適合的。例如,在一個火車票聯網售票系統中,顯然應該用動態集隨時反映 出共享數據的變化。
在記錄集中滾動,需要有一個標志來指明滾動後的位置(當前位置)。ODBC驅動程序會維護一個游標,用來跟蹤記錄集的當前記錄,可以把游標理解成跟蹤記錄集位置的一種機制。
游標庫(Cursor Library)是處於ODBC驅動程序管理器和驅動程序之間的動態鏈接庫(ODBCCR32.DLL).游標庫的主要功能是支持快照以及為底層驅動程序 提供雙向滾動能力,高層次的驅動程序不需要游標庫,因為它們是可滾動的.游標庫管理快照記錄的緩沖區,該緩沖區反映本程序對記錄的修改和刪除,但不反映其 它用戶對記錄的改變,由此可見,快照實際上相當於當前的游標庫緩沖區.
應注 意的是,快照是一種靜態游標(Static Cursor).靜態游標直到滾動到某個記錄才能取得該記錄的數據.因此,要保證所有的記錄都被快照,可以先滾動到記錄集的末尾,然後再滾動到感興趣的第 一個記錄上.這樣做的缺點是滾動到末尾需要額外的開銷,會降低性能.
與快照不同,動態集不用游標庫維持的緩沖區來存放記錄.實際上,動態集是不使用游標庫的,因為游標庫會屏蔽掉一些支持動態集的底層驅動程序功能.動態集是一種鍵集驅動游標(Keyset-Driven Cursor),當打開一個動態集時,驅動程序保存記錄集中每個記錄的鍵.只要游標在動態集中滾動,驅動程序就會通過鍵來從數據源中檢取當前記錄,從而保證選取的記錄與數據源同步.
從上面的分析中可以看出,快照和動態集有一個共同的特點,那就是在建立記錄集後,記錄集中的成員就已經確定了.這就是為什麼兩種記錄集都不能反映別的用戶添加記錄的原因.
10.5.2 域數據成員與數據交換
CRecordset類代表一個記錄集.用戶一般需要用ClassWizard創建一個CRecordset的派生類.ClassWizard可以為派 生的記錄集類創建一批數據成員,這些數據成員與記錄的各欄位相對應,被稱為欄位數據成員或域數據成員.例如,對於表10.2所示的將在後面例子中使用的數 據庫表,ClassWizard會在派生類中加入6個域數據成員
10.5.3 SQL查詢
記錄集的建立實際上主要是一個查詢過程,SQL的SELECT語句用來查詢數據源.在建立記錄集時,CRecordset會根據一些參數構造一個 SELECT語句來查詢數據源,並用查詢的結果創建記錄集.明白這一點對理解CRecordset至關重要.SELECT語句的句法如下:
SELECT rfx-field-list FROM table-name [WHERE m_strFilter]
[ORDER BY m_strSort]
其中table-name是表名,rfx-field-list是選擇的列(欄位).WHERE和ORDER BY是兩個子句,分別用來過濾和排序。下面是SELECT語句的一些例子:
SELECT CourseID, InstructorID FROM Section
SELECT * FROM Section WHERE CourseID=『MATH202』 AND Capacity=15
SELECT InstructorID FROM Section ORDER BY CourseID ASC
其中第一個語句從Section表中選擇CourseID和InstructorID欄位.第二個語句從Section表中選擇CourseID為 MATH202且Capacity等於15的記錄,在該語句中使用了象"AND"或"OR"這樣的邏輯連接符.要注意在SQL語句中引用字元串、日期或時 間等類型的數據時要用單引號括起來,而數值型數據則不用.第三個語句從Section表中選擇InstructorID列並且按CourseID的升序排 列,若要降序排列,可使用關鍵字DESC.
提示:如果列名或表名中包含有空格,則必需用方括弧把該名稱包起來。例如,如果有一列名為「Client Name」,則應該寫成「[Client Name]」。
10.5.4 記錄集的建立和關閉
要建立記錄集,首先要構造一個CRecordset派生類對象,然後調用Open成員函數查詢數據源中的記錄並建立記錄集.在Open函數中,可能會調用GetDefaultConnect和GetDefaultSQL函數.函數的聲明為
CRecordset( CDatabase* pDatabase = NULL);
參數pDatabase指向一個CDatabase對象,用來獲取數據源.如果pDatabase為NULL,則會在Open函數中自動構建一個 CDatabase對象.如果CDatabase對象還未與數據源連接,那麼在Open函數中會建立連接,連接字元串(參見10.3.1)由成員函數 GetDefaultConnect提供.
virtual CString GetDefaultConnect( );
該函數返回預設的連接字元串.Open函數在必要的時侯會調用該函數獲取連接字元串以建立與數據源的連接.一般需要在CRecordset派生類中覆蓋該函數並在新版的函數中提供連接字元串.
virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none );
throw( CDBException, CMemoryException );
該函數使用指定的SQL語句查詢數據源中的記錄並按指定的類型和選項建立記錄集.參數nOpenType說明了記錄集的類型,如表10.3所示,如果要求 的類型驅動程序不支持,則函數將產生一個異常.參數lpszSQL是一個SQL的SELECT語句,或是一個表名.函數用lpszSQL來進行查詢,如果 該參數為NULL,則函數會調用GetDefaultSQL獲取預設的SQL語句.參數dwOptions可以是一些選項的組合,常用的選項在表10.4 中列出.若創建成功則函數返回TRUE,若函數調用了CDatabase::Open且返回FALSE,則函數返回FALSE.
表10.3 記錄集的類型
類型
含義
AFX_DB_USE_DEFAULT_TYPE
使用預設值.
CRecordset::dynaset
可雙向滾動的動態集.
CRecordset::snapshot
可雙向滾動的快照.
CRecordset::dynamic
提供比動態集更好的動態特性,大部分ODBC驅動程序不支持這種記錄集.
CRecordset::forwardOnly
只能前向滾動的只讀記錄集.表10.4 創建記錄集時的常用選項
選項
含義
CRecordset::none
無選項(預設).
CRecordset::appendOnly
不允許修改和刪除記錄,但可以添加記錄.
CRecordset::readOnly
記錄集是只讀的.
CRecordset::skipDeletedRecords
有些資料庫(如FoxPro)在刪除記錄時並不真刪除,而是做個刪除標記,在滾動時將跳過這些被刪除的記錄.virtual CString GetDefaultSQL( );
Open函數在必要時會調用該函數返回預設的SQL語句或表名以查詢數據源中的記錄.一般需要在CRecordset派生類中覆蓋該函數並在新版的函數中提供SQL語句或表名.下面是一些返回字元串的例子.
「Section」 //選擇Section表中的所有記錄到記錄集中
「Section, Course」 //合並Section表和Course表的各列到記錄集中
//對Section表中的所有記錄按CourseID的升序進行排序,然後建立記錄集
「SELECT * FROM Section ORDER BY CourseID ASC」
上面的例子說明,通過合理地安排SQL語句和表名,Open函數可以十分靈活地查詢數據源中的記錄.用戶可以合並多個表的欄位,也可以只選擇記錄中的某些欄位,還可以對記錄進行過濾和排序.
上一小節說過,在建立記錄集時,CRecordset會構造一個SELECT語句來查詢數據源.如果在調用Open時只提供了表名,那麼SELECT語 句還缺少選擇列參數rfx-field-list(參見10.5.3).框架規定,如果只提供了表名,則選擇列的信息從DoFieldExchange中 的RFX語句里提取.例如,如果在調用Open時只提供了"Section"表名,那麼將會構造如下一個SELECT語句:
SELECT CourseID,SectionNo,InstructorID,RoomNo, Schele,Capacity FROM Section
建立記錄集後,用戶可以隨時調用Requery成員函數來重新查詢和建立記錄集.Requery有兩個重要用途:
使記錄集能反映用戶對數據源的改變(參見10.5.1).
按照新的過濾或排序方法查詢記錄並重新建立記錄集.
在調用Requery之前,可調用CanRestart來判斷記錄集是否支持Requery操作.要記住Requery只能在成功調用Open後調用,所以程序應調用IsOpen來判斷記錄集是否已建立.函數的聲明為
virtual BOOL Requery( );throw( CDBException, CMemoryException );
返回TRUE表明記錄集建立成功,否則返回FALSE.若函數內部出錯則產生異常.
BOOL CanRestart( ) const; //若支持Requery則返回TRUE
BOOL IsOpen( ) const; //若記錄集已建立則返回TRUE
CRecordset類有兩個公共數據成員m_strFilter和m_strSort用來設置對記錄的過濾和排序.在調用Open或Requery 前,如果在這兩個數據成員中指定了過濾或排序,那麼Open和Requery將按這兩個數據成員指定的過濾和排序來查詢數據源.
成員m_strFilter用於指定過濾器.m_strFilter實際上包含了SQL的WHERE子句的內容,但它不含WHERE關鍵字.使用m_strFilter的一個例子為:
m_pSet->m_strFilter=「CourseID=『MATH101』」; //只選擇CourseID為MATH101的記錄
if(m_pSet->Open(CRecordset::snapshot, 「Section」))
. . . . . .
成員m_strSort用於指定排序.m_strSort實際上包含了ORDER BY子句的內容,但它不含ORDER BY關鍵字.m_strSort的一個例子為
m_pSet->m_strSort=「CourseID DESC」; //按CourseID的降序排列記錄
m_pSet->Open();
. . . . . .
事實上,Open函數在構造SELECT語句時,會把m_strFilter和m_strSort的內容放入SELECT語句的WHERE和ORDER BY子句中.如果在Open的lpszSQL參數中已包括了WHERE和ORDER BY子句,那麼m_strFilter和m_strSort必需為空.
調用無參數成員函數Close可以關閉記錄集.在調用了Close函數後,程序可以再次調用Open建立新的記錄集.CRecordset的析構函數會調用Close函數,所以當刪除CRecordset對象時記錄集也隨之關閉。
10.5.5 滾動記錄
CRecordset提供了幾個成員函數用來在記錄集中滾動,如下所示.當用這些函數滾動到一個新記錄時,框架會自動地把新記錄的內容拷貝到域數據成員中.
void MoveNext( ); //前進一個記錄
void MovePrev( ); //後退一個記錄
void MoveFirst( ); //滾動到記錄集中的第一個記錄
void MoveLast( ); //滾動到記錄集中的最後一個記錄
void SetAbsolutePosition( long nRows );
該函數用於滾動到由參數nRows指定的絕對位置處.若nRows為負數,則從後往前滾動.例如,當nRows為-1時,函數就滾動到記錄集的末尾.注意,該函數不會跳過被刪除的記錄.
virtual void Move( long nRows, WORD wFetchType = SQL_FETCH_RELATIVE );
該函數功能強大.通過將wFetchType參數指定為SQL_FETCH_NEXT、SQL_FETCH_PRIOR、 SQL_FETCH_FIRST、SQL_FETCH_LAST和SQL_FETCH_ABSOLUTE,可以完成上面五個函數的功能.若 wFetchType為SQL_FETCH_RELATIVE,那麼將相對當前記錄移動,若nRows為正數,則向前移動,若nRows為負數,則向後移 動.
如果在建立記錄集時選擇了CRecordset::skipDeletedRecords選項,那麼除了SetAbsolutePosition外,在滾動記錄時將跳過被刪除的記錄,這一點對象FoxPro這樣的資料庫十分重要.
如果記錄集是空的,那麼調用上述函數將產生異常.另外,必須保證滾動沒有超出記錄集的邊界.調用IsEOF和IsBOF可以進行這方面的檢測.
BOOL IsEOF( ) const;
如果記錄集為空或滾動過了最後一個記錄,那麼函數返回TRUE,否則返回FALSE.
BOOL IsBOF( ) const;
如果記錄集為空或滾動過了第一個記錄,那麼函數返回TRUE,否則返回FALSE.
Ⅲ MFC基於對話框的工程怎麼使用資料庫保存數據
CString Filepath="Data.accdb";
int i=m_list.GetItemCount();//在列表的隊尾添加,所以先獲取行數
db.Open(Filepath);
Dbset.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM DataTable",0);
Dbset.AddNew();//在記錄集的隊尾添加
Dbset.SetFieldValue("Name",_variant_t(m_name));
Dbset.SetFieldValue("Age",atol(m_age));//將CString格式轉換為資料庫規定的格式
Dbset.SetFieldValue("Extra",_variant_t(m_extra));
Dbset.Update();//一定要及時更新
Dbset.Close();
db.Close();//並關閉////////////////////////////
看這段代碼,是把三個edit控制項里的值寫入Data.accdb資料庫文件中。
Ⅳ MFC中怎麼連接SQL資料庫
1. 由於使用的是ADO架構 首先需要在StdAfx.h文件中導入msado15.dll 和 oledb32.dll連個動態連接庫文件倒入方式為:
#import "msado15.dll" no_namespace rename ("EOF", "adoEOF")
#import "oledb32.dll" no_namespace
兩個文件的實際所在位置由於系統安裝的位置不同而不同。
no_namespace 使用無名命名空間 程序段比較短關聯較少的話可以這樣使用 否則請使用命名空間以免發生沖突,
rename ("EOF", "adoEOF") 重命名 EOF為 adoEOF 以免常量沖突。
2. 關於SQL Server以及的一些要求 首先安裝SQL Server的機器必須是 NT架構以上的系統 如果使用的是Windows XP SP2 的話需要對SQL Server打上SP4補丁方可網路訪問。
3. 最好建立一個單獨的資料庫操作類 使程序中需要對資料庫進行操作的地方繼承這個類。
4. 類成員如下
_ConnectionPtr m_pConnection; // 資料庫
_RecordsetPtr m_pRecordset; // 命令
_CommandPtr m_pCommand; // 記錄
5. 方法如下
bool connect2database();
bool check_user(_bstr_t name, _bstr_t pwd);
bool CBugListCommon::connect2database()
{
_bstr_t ConnectionString = "Provider=sqloledb;Data Source='SQLSERVER';Integrated Security='SSPI';Initial Catalog='Test';User Id='sa';Password='sa';";
//Data Source 資料庫實例名
//Initial Catalog表名
//User Id 用戶名
//Password 密碼
if(FAILED(CoInitialize(NULL)))
return FALSE;
m_pConnection.CreateInstance(__uuidof(Connection));
try
{
m_pConnection->Open(ConnectionString , "", "", adConnectUnspecified);
return TRUE;
}
catch(_com_error e)
{
AfxMessageBox("資料庫連接失敗");
return FALSE;
}
return FALSE;
}
bool CBugListCommon::check_user(_bstr_t name, _bstr_t pwd)
{
_bstr_t cmdtxt = "SELECT User_Name, User_PassWord FROM User_Table WHERE (User_Name = N'";
cmdtxt = cmdtxt + name + "')";
// cmdtxt == SELECT User_Name, User_PassWord FROM User_Table WHERE (User_Name = N'name')
m_pCommand.CreateInstance("ADODB.Command");
m_pCommand->ActiveConnection = m_pConnection;
m_pCommand->CommandText = cmdtxt;
m_pRecordset = m_pCommand->Execute(NULL, NULL, adCmdText);
if(!m_pRecordset->adoEOF)
{
_bstr_t tn;
tn = m_pRecordset->GetCollect("User_PassWord");
if(tn == pwd)
return TRUE;
else
return FALSE;
}
return FALSE;
}
Ⅳ 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中,如何連接sqlite3的資料庫,並對此資料庫操作
這個比較容易。按照網上提供的方法把sqlite編譯成dll和lib
將dll和lib在項目的輸入中添加好
在要操作的文件中#include 「sqlite3.h」就可以了。我做過這方面的項目,雖然是嵌入式wince使用,但是基本和windows相同。
下面是詳細的用法:
一. 編譯動態鏈接庫庫文件
1). 打開VC新建一個「Win32 Dynamic-Link Library」工程,命名為:sqlite3(也可以是其他的,注意這個就是編譯後的dll和lib的名字)
2). 在接下來的對話框中選擇"An empty DLL project",點 FINISH->OK
3). 將源碼中所有的 *.c *.h *.def 復制到工程文件夾下
4). 在工程的Source File中添加你下載到的SQLite源文件中所有*.c文件,
注意這里不要添加shell.c和tclsqlite.c這兩個文件。*注意需要將tclsqlite.c和shell.c、icu.c去掉。其中tclsqlite.c用於生成基於tcl的api,如果要編譯,這需要另外下載tcl.h;shell.c用於生成命令行模式的sqlite.exe,如果是靜態庫形式則可以選擇; icu是internationalcomponents forunicode,如果需要則需另外下載相關頭文件。
5). 將 SQLite 源文件中的 sqlite3.def 文件添加到在工程的Source File中
6). 在Header File中添加你下載到的SQLite源文件中所有*.h文件,
7). 開始編譯,Build(F7)一下
也許到這里會遇到一個錯誤:
e:\zieckey\sqlite\sqlite3\sqlite3ext.h(22) : fatal error C1083: Cannot open include file: 'sqlite3.h': No such file or directory
經檢查發現,源碼中包含sqlite3.h都是以 #include <sqlite3.h> 方式包含的,
這就是說編譯器在系統默認路徑中搜索,這樣當然搜索不到 sqlite3.h 這個頭文件啦,
這時可以改為 #include "sqlite3.h" ,讓編譯器在工程路徑中搜索,
但是如果還有其他地方也是以 #include <sqlite3.h> 方式包含的,那麼改源碼就顯得有點麻煩,
好了,我們可以這樣,在菜單欄依次選擇:Tools->Options...->Directeries
在下面的Directeries選項中輸入你的 sqlite3.h 的路徑,這里也就是你的工程目錄.
添加好後,我們在編譯一下就好了,
最後我們在工程目錄的 Debug 目錄生成了下面兩個重要文件:
動態鏈接庫文件 sqlite3.dll 和引入庫文件 sqlite3.lib
二. 使用動態鏈接庫
下面我們來編寫個程序來測試下我們的動態鏈接庫.
在VC下新建一個空的"Win32 Console Application" Win32控制台程序,工程命名為:TestSqliteOnWindows
再新建一個 test.cpp 的C++語言源程序,源代碼如下:
// name: test.cpp
// This prog is used to test C/C++ API for sqlite3 .It is very simple,ha !
// Author : zieckey
// data : 2006/11/28
#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
#define _DEBUG_
int main( void )
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("zieckey.db", &db); //打開指定的資料庫文件,如果不存在將創建一個同名的資料庫文件
if( rc )
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return (1);
}
else printf("You have opened a sqlite3 database named zieckey.db successfully!\nCongratulations! Have fun ! ^-^ \n");
//創建一個表,如果該表存在,則不創建,並給出提示信息,存儲在 zErrMsg 中
char *sql = " CREATE TABLE SensorData(ID INTEGER PRIMARY KEY,SensorID INTEGER,SiteNum INTEGER,Time VARCHAR(12),SensorParameter REAL);" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
#ifdef _DEBUG_
printf("zErrMsg = %s \n", zErrMsg);
#endif
//插入數據
sql = "INSERT INTO \"SensorData\" VALUES(NULL , 1 , 1 , '200605011206', 18.9 );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
sql = "INSERT INTO \"SensorData\" VALUES(NULL , 23 , 45 , '200605011306', 16.4 );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
sql = "INSERT INTO \"SensorData\" VALUES(NULL , 34 , 45 , '200605011306', 15.4 );" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
int nrow = 0, ncolumn = 0;
char **azResult; //二維數組存放結果
//查詢數據
sql = "SELECT * FROM SensorData ";
sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
int i = 0 ;
printf( "row:%d column=%d \n" , nrow , ncolumn );
printf( "\nThe result of querying is : \n" );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
printf( "azResult[%d] = %s\n", i , azResult[i] );
//刪除數據
sql = "DELETE FROM SensorData WHERE SensorID = 1 ;" ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
#ifdef _DEBUG_
printf("zErrMsg = %s \n", zErrMsg);
#endif
sql = "SELECT * FROM SensorData ";
sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
printf( "\n\n\n\nrow:%d column=%d " , nrow , ncolumn );
printf( "\nAfter deleting , the result of querying is : \n" );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
printf( "azResult[%d] = %s\n", i , azResult[i] );
//釋放掉 azResult 的內存空間
sqlite3_free_table( azResult );
#ifdef _DEBUG_
printf("zErrMsg = %s \n", zErrMsg);
#endif
sqlite3_close(db); //關閉資料庫
return 0;
}
另外,將sqlite3.h sqlite3.lib sqlite3.dll文件復制到我們的工程目錄.
最後 Project->Settings 在Link選項卡找到Object/library moles : 在最後填入sqlite3.lib 。
如果原來就有鏈接,請使用空格分隔。
現在可以編譯了.
運行結果如下:
You have opened a sqlite3 database named zieckey.db successfully!
Congratulations! Have fun ! ^-^
zErrMsg = (null)
row:3 column=5
The result of querying is :
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 1
azResult[6] = 1
azResult[7] = 1
azResult[8] = 200605011206
azResult[9] = 18.9
azResult[10] = 2
azResult[11] = 23
azResult[12] = 45
azResult[13] = 200605011306
azResult[14] = 16.4
azResult[15] = 3
azResult[16] = 34
azResult[17] = 45
azResult[18] = 200605011306
azResult[19] = 15.4
zErrMsg = (null)
row:2 column=5
After deleting , the result of querying is :
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 2
azResult[6] = 23
azResult[7] = 45
azResult[8] = 200605011306
azResult[9] = 16.4
azResult[10] = 3
azResult[11] = 34
azResult[12] = 45
azResult[13] = 200605011306
azResult[14] = 15.4
zErrMsg = (null)
Press any key to continue
在上面的第五步
5). 將 SQLite 源文件中的 sqlite3.def 文件添加到在工程的Source File中
是必須的, sqlite3.def 這個文件的加入會生成 *.lib引入庫文件,這個對於*.dll文件是很重要的.否則你光有*.dll文件在程序調用的時候就不是那麼方便了,因為這樣你只能通過動態載入dll的方式調用dll庫中函數
這個程序,我們先創建一個資料庫,然後新建一個表,然後插入一些數據,
再查詢看看插入的數據是否正確,然後又刪除一些數據,刪除後我們再查詢了一下,
發現我們的刪除操作也是成功的.
這個程序簡單的調用 sqlite 的函數介面來實現對資料庫的管理,
包括創建資料庫、創建表格、插入數據、查詢數據、刪除數據等。
Ⅶ 如何使用MFC進行資料庫查詢
問題很簡單我給你看看一段代碼你就知道了
try
{
CDatabase db;
db.Open(NULL,false,false,"ODBC;DRIVER={MICROSOFT ACCESS DRIVER (*.mdb)};DBQ=手機進銷存管理資料庫.mdb");
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly,"select * from Input;",CRecordset::readOnly);
CString s;
rs.GetFieldValue("廠商",s);
MessageBox(s);
}
catch (CDBException e)
{
MessageBox(e.m_strError);
Ⅷ MFC怎麼與資料庫連接,求詳細步驟!!!!!急急急!!!!!!
比如在你的工程目錄中建一個
dbf\vir.mdb
//access資料庫,然後你需要做以下操作:
1.在stadafx.h裡面添加#include
//新加入頭文件,用於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如何用資料庫
你首先安裝Mysql,然後使用下面代碼
在MyProc類中增加MySqlConnect方法,strUSR,strPWD分別為用戶名和密碼,登陸資料庫需要
BOOL MyPorc::MySqlConnect(CString strUSR,CString strPWD)
{
unsigned short Port = 3306; //埠
CString IPAddress ="127.0.0.1"; //本地資料庫
CString UserName = strUSR;
CString Password = strPWD;
ssock=(MYSQL *)malloc(sizeof(MYSQL));
mysql_init(ssock);
if(ssock == NULL)
{
AfxMessageBox("連接失敗,請稍後在試! ");
return FALSE;
}
ssock = mysql_real_connect(ssock, IPAddress, UserName, Password, NULL, Port, NULL, 0);
if(!ssock)
{
unsigned int mtint = mysql_errno(ssock);
AfxMessageBox("登陸失敗! ");
return FALSE;
}
return TRUE;
}
Ⅹ 如何進行MFC資料庫編程
MFC資料庫編程包含如下:
首先,你要選擇使用什麼方式連接資料庫,有ODBC,ADO等,
其他,就是sql語句操作資料庫了,對後是怎麼存儲操作數據。