當前位置:首頁 » 操作系統 » mfc調用資料庫

mfc調用資料庫

發布時間: 2025-06-16 08:10:23

『壹』 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的cdatabase類直接執行sql命令

在使用MFC的CDatabase類執行SQL命令時,首先需要創建一個CDatabase對象,然後打開資料庫連接。在該示例中,我們使用了OpenEx方法並指定了資料庫連接字元串。接下來,創建一個CRecordset對象,並將其資料庫指針設置為剛才創建的CDatabase對象。接著可以直接執行SQL查詢語句,但需注意SQL語句字元串不能以空格開頭。例如,可以執行如下SQL查詢:SELECT 欄位或計算列 FROM 表 WHERE 條件。在執行查詢後,使用CRecordset對象的Open方法以快照模式打開結果集。通過循環遍歷結果集,可以使用GetFieldValue方法獲取每一行數據,該方法將數據保存在一個CDBVariant變數中。值得注意的是,不能直接使用數字0作為列索引,應該從1開始計數。

此外,還可以使用其他方式獲取查詢結果,例如通過直接操作CRecordset對象的欄位。在循環遍歷過程中,可以調用MoveFirst方法定位到結果集的第一行,然後使用GetFieldValue方法按列索引獲取具體欄位值。完成數據獲取後,記得關閉CRecordset和CDatabase對象以釋放資源。

以上示例僅展示了如何使用CDatabase和CRecordset類執行簡單的SQL查詢。實際上,MFC還提供了豐富的API用於處理更復雜的數據操作。例如,可以使用CRecordset的AddNew和Update方法插入和更新數據,使用Delete方法刪除記錄。在執行這些操作時,同樣需要注意正確管理資料庫連接和資源。

總結來說,使用MFC的CDatabase類執行SQL命令是一個相對直接的過程,只需按照正確的步驟操作即可。關鍵在於正確設置資料庫連接,編寫正確的SQL語句,以及合理使用CRecordset類的方法來處理查詢結果。通過這些步驟,可以有效地在MFC應用程序中實現資料庫操作。

『叄』 基於對話框的MFC如何連接資料庫

ADO的三個核心對象

Connection對象
Connection對象表示了到資料庫的連接,它管理應用程序和資料庫之間的通信。 Recordset和Command對象都有一個ActiveConnection屬性,該屬性用來引用Connection對象。
Command對象
Command對象被用來處理重復執行的查詢,或處理需要檢查在存儲過程調用中的輸出或返回參數的值的查詢。
Recordset對象
Recordset對象被用來獲取數據。 Recordset對象存放查詢的結果,這些結果由數據的行(稱為記錄)和列(稱為欄位)組成。每一列都存放在Recordset的Fields集合中的一個Field對象中。

在VC中利用ADO訪問資料庫

1.新建一個基於對話框的工程,名為ADO。
2.在對話框中放一ListBox和一個Button控制項。
3.在使用時須導入MSADO15.dll,方法是在StdAfx.h中#import "D:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")
至少於將EOF改名為rsEOF,是為了避免與文件中的EOF重名。然後編譯程序,將產生的debug目錄下的兩個文件MSADO15.tlh和MSADO15.tli加到工程中,其目的只是方便我們查看而已。並不是編譯需要它。
ADO也是COM組件,須初始化COM庫方法是CoInitialize(NULL);使用完後須CoUninitialize();
代碼如下:

void CAdoDlg::OnBtnQuery()
{
int i,j;
char mdbPath[256]; //mdb文件路徑
char connstr[512]; //連接字元串
char connstr2[512]; //連接字元串2

memset(mdbPath,0,256);
memset(connstr,0,512);
memset(connstr2,0,512);
strcpy(connstr,"driver={Microsoft Access Driver (*.mdb)};dbq=");
if(!::GetCurrentDirectory(256,mdbPath))
{
AfxMessageBox("獲取資料庫路徑失敗!");
return;
}
if(mdbPath[strlen(mdbPath)-1]!='\\')
mdbPath[strlen(mdbPath)]='\\';
strcat(mdbPath,"data.mdb");
strcat(connstr,mdbPath);
for(i=0,j=0;i<strlen(connstr);i++,j++)
{
if(connstr[i]!='\\')
connstr2[j]=connstr[i];
else
{
connstr2[j]='\\';
connstr2[++j]='\\';
}
}

CoInitialize(NULL);
_ConnectionPtr pConn(__uuidof(Connection));//產生connection智能指針
_RecordsetPtr pRst(__uuidof(Recordset)); //產生recordset智能指針

pConn->Open(connstr2, "","",adModeUnknown); //打開資料庫
pRst->Open("select * from user",_variant_t((IDispatch*)pConn),adOpenStatic,adLockOptimistic,adCmdText);
while(!pRst->rsEOF)//將查詢到的數據加到列表框
{
((CListBox*)GetDlgItem(IDC_LIST1))->AddString(
(_bstr_t)pRst->GetCollect("name"));
pRst->MoveNext();
}
//插入一條記錄
pRst->AddNew();
pRst->PutCollect("name",_variant_t("sun"));
pRst->PutCollect("age",_variant_t((long)21));
pRst->Update();

pRst->Close();
pConn->Close();
pRst.Release();
pConn.Release();
CoUninitialize();
}

熱點內容
易語言靜態編譯破解 發布:2025-08-17 01:55:32 瀏覽:801
韓庚王麗坤超級訪問 發布:2025-08-17 01:50:33 瀏覽:809
羅茨泵壓縮比 發布:2025-08-17 01:42:47 瀏覽:731
c語言分段函數y 發布:2025-08-17 01:42:44 瀏覽:187
oracle資料庫默認用戶名 發布:2025-08-17 01:42:04 瀏覽:900
伺服器一般用什麼語言開發的 發布:2025-08-17 01:39:51 瀏覽:423
onenote安卓加密 發布:2025-08-17 01:28:27 瀏覽:280
干將莫邪安卓最低分在哪裡 發布:2025-08-17 01:18:29 瀏覽:849
編譯運行是灰色的 發布:2025-08-17 01:05:18 瀏覽:549
php在線文件管理 發布:2025-08-17 00:51:36 瀏覽:836