⑴ MFC 通用操作Access 資料庫的驅動
MFC ODBC資料庫簡述
開放數據互連(Open Database Connectivity,簡稱ODBC)是一種資料庫的互操作平台,通過經嚴格定義的各個級別的ODBC介面和客戶系統的初始裝置,能夠為應用程序提供資料庫類型透明性和位置透明性,讓應用程序的編寫者避免了與數據源相聯的復雜性。MFC的資料庫擴展部分封裝了使用ODBC數據資源的細節,應用程序可以直接使用MFC中的資料庫擴展類,來操縱ODBC驅動程序管理器,訪問資料庫。進行MFC ODBC資料庫開發時,所需的基礎工具就是MFC ODBC資料庫類的使用。利用MFC ODBC開發就是利用MFC ODBC資料庫類來操縱ODBC數據源。Visual C++的大多數ODBC訪問是通過MFC來完成的。Visual C++的MFC類庫定義了幾個資料庫類,在利用MFC編程時常常用到,它們是CDatabase(資料庫類)、CRecordSet(記錄集類)、和CRecordView(可視記錄集類)。
對於MFC ODBC資料庫類來說,CDatabase類對象表示一個同數據源的連接,通過它可以對數據源進行操作。而CRecordSet對象代表從數據源中選擇的一組記錄的集合,也就是通常所說的記錄集對象。
CRecordSet對象通常用於兩種形式:動態集(dynasets)和快照集(snapshots)。動態集能與其他用戶所做的更改保持同步,快照集則是數據的一個靜態視圖。每一種形式在記錄被打開時都提供一組記錄,區別在於,當用戶在一個動態集里滾動到一條記錄時,有其他用戶或是應用程序中的其他記錄集所做的更改就會相應地顯示出來。CRecordView類對象能以控制的形式顯示資料庫記錄。這個視圖是直接連接到一個CRecordSet對象的表視圖。
一個應用實例
本實例是某項目中的一部分,目的是實現MFC ODBC資料庫與Access數據表格之間的相互操作。包括用Visual C++中的MFC ODBC技術實現對Access數據表格的內容的顯示、添加、修改和刪除的功能。
1、 ODBC數據源的創建
筆者使用的操作系統為Windows XP,工具是Visual C++6.0。此例中建立的Access表格取名為「plc」。
在「控制面板」中雙擊「管理工具」圖標,然後在新出現的窗口中雙擊「數據源(ODBC)」,在彈出的對話框中選中「用戶DSN」中的「dBASE Files」,單擊「添加」按鈕,從彈出的對話框中選中「Microsoft Access Driver(*.mdb)」。單擊「完成」後,將彈出一個新的對話框,在數據源名及說明後的編輯框中填入表格名「plc」。
在命名數據源之後,需要把它連接到一個資料庫。單擊「選擇」,如圖1所示,得到存儲在數據目錄中plc.mdb的拷貝文件,選中之,單擊「確定」關閉此對話框。然後單擊「確定」,完成數據源的創建。
⑵ MFC如何獲得資料庫中表的個數
為了從資料庫中獲取表的數量,首先需要建立與資料庫的連接。通常使用CDatabase類來實現這一目標。連接建立後,接下來需要使用CRecordset對象來打開所需的表。CRecordset對象的Open方法接受一個SQL查詢語句作為參數,該語句可以查詢sysobjects表中的表信息。一個常用的查詢語句是:SELECT COUNT(sysobjects.name) FROM sysobjects WHERE xtype='U';此查詢會返回資料庫中所有表的數量,其中xtype值為'U'代表表。
在執行完上述查詢後,接下來調用CRecordset對象的MoveFirst方法將游標移動到結果集的第一行。然後,可以使用CRecordset對象的GetFieldValue方法來獲取表數量的值。GetFieldValue方法接受一個欄位名作為參數,並返回該欄位的值。
值得注意的是,這種方法依賴於資料庫系統中sysobjects表的存在及其結構。在不同的資料庫管理系統中,sysobjects表的結構可能會有所不同,因此可能需要調整上述查詢語句以適應具體的資料庫環境。
此外,如果資料庫中存在大量表,執行此查詢可能會消耗較多的資源,因此在實際應用中應盡量避免頻繁執行此類查詢。對於頻繁查詢表數量的需求,可以考慮在應用程序中緩存查詢結果,或者定期更新緩存值,以減少資料庫查詢的次數。
總之,通過以上步驟,可以有效地從資料庫中獲取表的數量。這種方法不僅適用於MFC應用程序,也可在其他支持SQL查詢的語言或框架中使用。
在實際開發過程中,建議詳細閱讀目標資料庫系統的文檔,以確保查詢語句和操作方法的正確性。同時,也要注意性能優化,避免對資料庫造成不必要的負擔。
⑶ 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 的函數介面來實現對資料庫的管理,
包括創建資料庫、創建表格、插入數據、查詢數據、刪除數據等。