新聞中心
在C語言中,數(shù)據(jù)庫參數(shù)傳遞是一項非常重要的技術,因為它在大多數(shù)程序中都被廣泛應用。它允許您以一種有效的方式讀取和寫入數(shù)據(jù)庫中的數(shù)據(jù),并且管理數(shù)據(jù)庫的連接和事務。在本文中,我們將介紹一些C語言中的數(shù)據(jù)庫參數(shù)傳遞方法,以幫助您增強對數(shù)據(jù)庫的訪問和管理。

一. 使用結構體
結構體是一種C語言中常用的數(shù)據(jù)結構,用于存儲不同數(shù)據(jù)類型的值。當在C語言中處理數(shù)據(jù)庫時,您可以使用結構體來存儲和快速訪問連接和查詢字符串. 下面是使用一個結構體來管理數(shù)據(jù)庫參數(shù)的示例:
“`
struct DatabaseParams {
char *host;
char *user;
char *password;
char *database;
};
“`
在上面的代碼中,我們定義了一個名為DatabaseParams的結構體,該結構體包含四個字符型的指針類型的成員變量。host表示數(shù)據(jù)庫所在的主機名,user表示數(shù)據(jù)庫登錄用戶名,password表示數(shù)據(jù)庫登錄密碼,database表示要連接的數(shù)據(jù)庫名稱。通過這種方式,我們可以在程序處理數(shù)據(jù)庫時輕松訪問這些參數(shù)。
二. 將參數(shù)作為函數(shù)參數(shù)傳遞
將數(shù)據(jù)庫參數(shù)作為函數(shù)的參數(shù)傳遞是一種通用的方法,經(jīng)常在C語言中使用。這種方法可以用來打開數(shù)據(jù)庫連接,執(zhí)行查詢操作,關閉數(shù)據(jù)庫連接等。通過在函數(shù)調用時傳遞參數(shù),函數(shù)可以訪問所需的數(shù)據(jù)并執(zhí)行必要的操作。下面是一個使用此方法的示例:
“`
void open_database(char *host, char *user, char *password, char *database) {
// Open database connection
}
void close_database() {
// Close database connection
}
int execute_query(char *query) {
// Execute query and return result
}
“`
在上面的示例中,我們使用三個不同的函數(shù)來分別打開和關閉數(shù)據(jù)庫并執(zhí)行查詢操作。在打開數(shù)據(jù)庫函數(shù)open_database中,我們接受四個不同的參數(shù):主機名,登錄用戶名,密碼和數(shù)據(jù)庫名稱。這些參數(shù)在打開數(shù)據(jù)庫連接時被使用,并由該函數(shù)告知成功或失敗反饋。您可以使用類似的方法來為其他操作設計更多的函數(shù),例如執(zhí)行SQL命令。
三. 使用動態(tài)鏈接庫(DLL)
使用動態(tài)鏈接庫是一種提供多種數(shù)據(jù)庫連接和查詢功能的強大方法。動態(tài)鏈接庫可以讓您使用其他人編寫的庫并從您的程序中調用函數(shù)。您可以調用連接和查詢函數(shù)以訪問一個特定的數(shù)據(jù)庫和數(shù)據(jù)。這種方法可以在不同的平臺和編譯器上使用,并被廣泛應用于許多開源數(shù)據(jù)庫連接庫,例如ODBC(開放式數(shù)據(jù)庫連接)和JDBC(Java數(shù)據(jù)庫連接)。下面是一個使用ODBC的示例:
“`
#include
#include
#include
#include
int mn() {
SQL_HANDLE_ENV env_handle;
SQL_HANDLE_DBC dbc_handle;
SQLRETURN retcode;
char *dsn = “DSN=mydatabase”;
/* Allocate an environment handle */
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env_handle);
if (!SQL_SUCCEEDED(retcode)) {
return 1;
}
/* Set the version number for the environment handle */
retcode = SQLSetEnvAttr(env_handle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
if (!SQL_SUCCEEDED(retcode)) {
SQLFreeHandle(SQL_HANDLE_ENV, env_handle);
return 1;
}
/* Allocate a connection handle */
retcode = SQLAllocHandle(SQL_HANDLE_DBC, env_handle, &dbc_handle);
if (!SQL_SUCCEEDED(retcode)) {
SQLFreeHandle(SQL_HANDLE_ENV, env_handle);
return 1;
}
/* Connect to the database */
retcode = SQLConnect(dbc_handle, (SQLCHAR *)dsn, SQL_NTS, NULL, 0, NULL, 0);
if (!SQL_SUCCEEDED(retcode)) {
SQLFreeHandle(SQL_HANDLE_DBC, dbc_handle);
SQLFreeHandle(SQL_HANDLE_ENV, env_handle);
return 1;
}
/* Clean up the handles */
SQLDisconnect(dbc_handle);
SQLFreeHandle(SQL_HANDLE_DBC, dbc_handle);
SQLFreeHandle(SQL_HANDLE_ENV, env_handle);
return 0;
}
“`
在上面的示例中,我們使用ODBC來連接一個數(shù)據(jù)庫。我們使用SQLAllocHandle()函數(shù)來分配SQL_HANDLE_ENV和SQL_HANDLE_DBC句柄,以控制環(huán)境和數(shù)據(jù)庫連接。然后,我們使用SQLConnect()函數(shù)來打開連接,如果未連接,則返回1。我們使用SQLDisconnect()函數(shù)來關閉連接并釋放句柄。
相關問題拓展閱讀:
- c語言怎么把鏈表數(shù)據(jù)寫進mysql
- 用C編寫數(shù)據(jù)庫怎么寫
- 用Visual C++開發(fā)數(shù)據(jù)庫應用程序()
c語言怎么把鏈表數(shù)據(jù)寫進mysql
方法如下:
1.頭文件:
#include
#include
#include//這個是必需要包含的,下面對mysql的所有操作函數(shù),都出自這里
2.定義一個MYSQL變量:
MYSQLmysql;
這里MYSQL是一個用于連接MySql數(shù)據(jù)庫的變量。
在后面對mysql數(shù)據(jù)庫的操作中,我們就用這個MYSQL變量作為句柄的。
3.定義數(shù)據(jù)庫參數(shù):
charhost=”localhost”;
charuser=”username”;
charpasswd=”pwd”;
chardbname=”testdb”;
4.數(shù)據(jù)庫操作
1).初始化數(shù)據(jù)庫:
mysql_init(&mysql);
2).連接數(shù)據(jù)庫:
mysql_real_connect(&mysql,host,user,passwd,dbname,0,NULL,0);
我們在操作時,可以對以上的函數(shù)進行if測試,如果初始化或者連接出錯,作出相應提示,以便調試。
5.對數(shù)據(jù)庫的操作:
Mysql_query(&mysql,“select*fromtestdbwherecondition”);
我們在實際操作中,為了更方便的使用程序中的某些變量,我們將會用到一個函數(shù):
intsprintf(char*str,constchar*format,?);
這個函數(shù)用來格式化我們的字符串,然后將變量按照給你的格式,賦給之一個參數(shù)。
我們使用這個方法方法可以很方便的使用我們的變量來對數(shù)據(jù)庫進行操作。例如我們將要進行數(shù)據(jù)庫的查詢操作,我們就可以這樣使用:
sprintf(sql,”select*fromtestdbwhereusername=‘%s’”,u_name);
然后使用mysql_query(&mysql,sql)進行查詢。
MySQL是一個關系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQLAB公司開發(fā),屬于Oracle旗下產(chǎn)品。MySQL是更流行的關系型數(shù)據(jù)庫管理系統(tǒng)之一,在WEB應用方面,MySQL是更好的RDBMS(RelationalDatabaseManagementSystem,關系數(shù)據(jù)庫管理系統(tǒng))應用軟件之一。
用C編寫數(shù)據(jù)庫怎么寫
一個萬能的DBHelper就可以解決都事情,直接對數(shù)據(jù)庫中的存儲過程進行調用,只需要傳入?yún)?shù)就可以和你調用的存儲過程就可以。有關萬能DBHelper的參考代碼如下:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace Clock
{
public static class DBHelper
{
private static SqlConnection connection;//這里的SqlConnection 自己寫//對數(shù)據(jù)進行查詢時候調用的
public static SqlConnection Connection
{
get
{
string connectionString = “Data Source=PC-Ahsun;Initial Catalog=Clock; uid=sa;pwd=striveahsun”;
if (connection == null)
{
connection = new SqlConnection(connectionString);
connection.Open();
}
else if (connection.State == System.Data.ConnectionState.Closed)
{
connection.Open();
}
else if (connection.State == System.Data.ConnectionState.Broken)
{
connection.Close();
connection.Open();
}
return connection;
}
}//對數(shù)據(jù)進行增刪改時候調用的
public static int ExecuteCommand(string sql)
{
SqlCommand cmd = new SqlCommand(sql,connection);
int resualt = cmd.ExecuteNonQuery();
return resualt;
}
}
}
用Visual C++開發(fā)數(shù)據(jù)庫應用程序()
3、 使用MFC訪問ODBC數(shù)據(jù)源
3.1 概述
VisualC++的MFC類庫定義了幾個數(shù)據(jù)庫類。在利用ODBC編程時,經(jīng)常要使用到CDatabase(數(shù)據(jù)庫類),CRecordSet(記錄集類)和CRecordView(可視記錄集類)。 其中:
CDatabase類對象提供了對數(shù)據(jù)源的連接,通過它你可以對數(shù)據(jù)源進行操作。
CRecordView類對象能以控制的形式 顯示數(shù)據(jù)庫記錄。這個視圖是直接連到一個CRecordSet對象的表視圖。
CRecordSet類對象提供了從數(shù)據(jù)源 中提取出的記錄集。CRecordSet對象通常用于兩種形式: 動態(tài)行集(dynasets)和快照集(snapshots)。動態(tài)行集能保 持與其他用戶所做的更改保持同步。快照集則是數(shù)據(jù)的一個靜態(tài)視圖。每一種形式在記錄集被打開時都提供一組記錄,所不同的是,當你在一個動態(tài)行集里滾 動到一條記錄時,由其他用戶或是你應用程序中的其他記錄集對該記錄所做的更改會相應地顯示出來。腔吵
Visual C++提供了幾種記錄集,可以用來定制應用程序的工作方式。查看這些不同選項的最快方式要兼顧速度和特征。你會發(fā)現(xiàn),在很多情況下,如果想添加特征,就必須付出程序執(zhí)行速度降低的代價。下面告訴你一些可以自由支配的記錄集選項。更重要的是,要告訴你從這個選項可以獲得更快的速度還是更多的特征。
1、Snapshot(快照) 這個選項要Visual C++在一次快照中下載整個查詢。換言之,及時快速地給數(shù)據(jù)庫內容拍照,并把它作為未來工作的基礎。這種方法有三個缺點。之一,你看不到別人在網(wǎng)絡上做的更新,這可能意味著你的決定是建立在老信息的基礎上。第二,一次就下載所有這些記錄,這意味著在下載期間給網(wǎng)絡增加了沉重的負擔。第三,記錄下載時用戶會結束等待,這意味著網(wǎng)絡的呼叫性能變得更低。然而這種方法也有兩個優(yōu)點。之一,記錄一旦被下載,該工作站所需的網(wǎng)絡活動幾乎就沒有了棗這為其它請求釋放了帶寬??傊銜吹骄W(wǎng)絡的吞吐量增大了。第二,因為所有被申請的記錄都在用戶的機器上,所以用戶實際上會得到應用程序更佳的總體性能。你可能想把快照的方法限制在較小的數(shù)據(jù)庫上使用,原因在于快照適用于用戶請求信息而不適用于數(shù)據(jù)編輯會話。
2、Dynaset(動態(tài)集) 使用這個選項時,Visual C++創(chuàng)建指向所請求的每個記錄的實際指針。另外,只有填充屏幕時實際需要的記錄是從服務器上下載來的。這種方法的好處很明顯。幾乎馬上就能在屏幕上看到記錄。而且還會看到其它用戶對數(shù)據(jù)庫所做的更改。最后,其它用戶也會看到你做的更改,因為動態(tài)集在你更改記錄時被上載到服務器上。很明顯,這種方法要求對服務器的實時訪問,它槐脊減小了網(wǎng)絡總吞吐量并降低了應用程序的性能。這個選項適合于創(chuàng)建用戶要花費很多時間來編輯數(shù)據(jù)的應用程序。同時,它也是大型數(shù)據(jù)庫的更佳選擇,原因在于只需下載用戶實際需要的信息。
3.2 應用ODBC編程
可以應用AppWizard來建立一個ODBC的應用程序框架,也可以直接使用ODBC來進行數(shù)據(jù)庫編程,這時,應包括頭文鉛圓滲件afxdb.h。
應用ODBC編程兩個最重要的類是CDatabase和CRecordSet,但在應用程序中,不應直接使用CRecordSet類,而必須從CRecordSet類產(chǎn)生一個導出類,并添加相應于數(shù)據(jù)庫表中字段的成員變量。隨后,重載CRecordset類的成員函數(shù)DoFieldExchange,該函數(shù)通過使用RFX函數(shù)完成數(shù)據(jù)庫字段與記錄集域數(shù)據(jù)成員變量的數(shù)據(jù)交換,RFX函數(shù)同對話框數(shù)據(jù)交換(DDX)機制相類似,負責完成數(shù)據(jù)庫與成員變量間的數(shù)據(jù)交換。
下面舉例說明在VisualC++環(huán)境中ODBC 的編程技巧:
3.21 數(shù)據(jù)庫連接
在CRecordSet類中定義了一個成員變 量m_pDatabase:
CDatabase *m_pDatabase;
它是指向對象數(shù)據(jù)庫類的指針。如果在CRecordSet類對象調用Open()函數(shù)之前,將一個已經(jīng)打開的CDatabase類對象指針傳給m_pDatabase,就能共享相同 的CDatabase類對象。如:
CDatabase m_db;
CRecordSet m_set1,m_set2;
m_db.Open(_T(“Super_ES”)); // 建 立ODBC 連 接
m_set1.m_pDatabase=m_db; //m_set1 復 用m_db 對 象
m_set2.m_pDatabse=m_db; // m_set2 復 用m_db 對 象
或如下:
Cdatabase db;
db.Open(“Database”); //建立ODBC連接
CrecordSet m_set(db); //構造記錄集對象,使數(shù)據(jù)庫指向db
3.22 查詢記錄
查詢記錄使用CRecordSet::Open()和 CRecordSet::Requery()成員函數(shù)。在使用CRecordSet類對象之前,必須使用 CRecordSet::Open()函數(shù)來獲得有效的記錄集。一旦已經(jīng)使用過CRecordSet::Open() 函數(shù),再次查詢時就可以應用CRecordSet::Requery()函數(shù)。在調 用CRecordSet::Open()函數(shù)時,如果已經(jīng)將一個已經(jīng)打開的CDatabase 對象指針傳給CRecordSet類對象的m_pDatabase成員變量,則使 用該數(shù)據(jù)庫對象建立ODBC連接;否則如果m_pDatabase為空指 針,就新建一個CDatabase類對象并使其與缺省的數(shù)據(jù)源 相連,然后進行CRecordSet類對象的初始化。缺省數(shù)據(jù)源 由GetDefaultConnect()函數(shù)獲得。你也可以提供你所需要的SQL 語句,并以它來調用CRecordSet::Open()函數(shù),例如:
m_Set.Open(AFX_DATABASE_USE_DEFAULT,strSQL);
如果沒有指定參數(shù),程序則使 用缺省的SQL語句,即對在GetDefaultSQL()函數(shù)中指定的SQL語 句進行操作:
CString CTestRecordSet::GetDefaultSQL()
{return _T(“,”);}
對于GetDefaultSQL()函數(shù)返回的表名, 對應的缺省操作是SELECT語句,即:
SELECT * FROM BasicData,MainSize
查詢過程中也可以利用CRecordSet的 成員變量m_strFilter和m_strSort來執(zhí)行條件查詢和結果排序。m_strFilter 為過濾字符串,存放著SQL語句中WHERE后的條件串;m_strSort 為排序字符串,存放著SQL語句中ORDERBY后的字符串。 如:
m_Set.m_strFilter=”TYPE=’電動機'”;
m_Set.m_strSort=”VOLTAGE”;
m_Set.Requery();
對應的SQL語句為:
SELECT * FROM BasicData,MainSize
WHERE TYPE=’電動機’
ORDER BY VOLTAGE
除了直接賦值給m_strFilter以外,還 可以使用參數(shù)化。利用參數(shù)化可以更直觀,更方便地 完成條件查詢任務。使用參數(shù)化的步驟如下:
(1).聲明參變量:
Cstring p1;
Float p2;
(2).在構造函數(shù)中初始化參變量
p1=_T(“”);
p2=0.0f;
m_nParams=2;
(3).將參變量與對應列綁定
pFX-SetFieldType(CFieldExchange::param)
RFX_Text(pFX,_T(“P1”),p1);
RFX_Single(pFX,_T(“P2”),p2);
完成以上步驟之后就可以利用參變量進行條件查詢了:
m_pSet-m_strFilter=”TYPE=?ANDVOLTAGE=?”;
m_pSet-p1=”電動機”;
m_pSet-p2=60.0;
m_pSet-Requery();
參變量的值按綁定的順序替換 查詢字串中的“?”適配符。
如果查詢的結果是多條記錄的 話,可以用CRecordSet類的函數(shù)Move(),MoveNext(),MovePrev(),MoveFirst() 和MoveLast()來移動光標。
3.23 增加記錄
增加記錄使用AddNew()函數(shù),要求數(shù)據(jù)庫必須是以允許增加的方式打開:
m_pSet-AddNew(); //在表的末尾增加新記錄
m_pSet-SetFieldNull((m_pSet-m_type),FALSE);
m_pSet-m_type=”電動機”;
… //輸入新的字段值
m_pSet- Update(); //將新記錄存入數(shù)據(jù)庫
m_pSet-Requery(); //重建記錄集
3.24 刪除記錄
直接使用Delete()函數(shù),并且在調用Delete() 函數(shù)之后不需調用Update()函數(shù):
m_pSet-Delete();
if(!m_pSet-IsEOF())
m_pSet-MoveNext();
else
m_pSet-MoveLast();
3.25 修改記錄
修改記錄使用Edit()函數(shù):
m_pSet-Edit(); //修改當前記錄
m_pSet-m_type=”發(fā)電機”; //修改當前記錄字段值
…
m_pSet-Update(); //將修改結果存入數(shù)據(jù)庫
m_pSet-Requery();
3.26 統(tǒng)計記錄
統(tǒng)計記錄用來統(tǒng)計記錄集的總數(shù)。可以先聲明一個CRecordset對象m_pSet。再綁定一個變量m_lCount,用來統(tǒng)計記錄總數(shù)。執(zhí)行如下語句:
m_pSet-Open(“Select Count(*) from 表名 where 限定條件”);
RecordCount=m_pSet-m_lCount;
m_pSet-Close();
RecordCount即為要統(tǒng)計的記錄數(shù)。
或如下:
CRecordset m_Set(db); //db 為CDatabase對象
CString strValue;
m_Set.Open(Select count(*) from 表名 where 限定條件”);
m_pSet.GetFieldValue((int)0,strValue);
long count=atol(strValue);
m_set.Close();
count為記錄總數(shù)。
3.27 執(zhí)行SQL語句
雖然通過CRecordSet類,我們可以完成 大多數(shù)的查詢操作,而且在CRecordSet::Open()函數(shù)中也可以 提供SQL語句,但是有的時候我們還想進行一些其他操 作,例如建立新表,刪除表,建立新的字段等等,這 時就需要使用到CDatabase類的直接執(zhí)行SQL語句的機制。通 過調用CDatabase::ExecuteSQL()函數(shù)來完成SQL語句的直接執(zhí)行:
如下代碼所示
BOOL CDB::ExecuteSQLAndReportFailure(const CString strSQL)
{
TRY
{
m_pdb-ExecuteSQL(strSQL); //直接執(zhí)行SQL語句
}
CATCH (CDBException,e)
{
CString strMsg;
strMsg.LoadString(IDS_EXECUTE_SQL_FAILED);
strMsg+=strSQL;
return FALSE;
}
END_CATCH
return TRUE;
}
應當指出的是,由于不同DBMS提 供的數(shù)據(jù)操作語句不盡相同,直接執(zhí)行SQL語句可能會破壞軟件的DBMS無關性,因此在應用中應當慎用此類操作。
3.28 注意
從CRecordSet導出的類中如果包含DataTime類型的數(shù)據(jù),在VC中是用CTime類型來替代的,這時,構造函數(shù)沒有賦于缺省值。這時,我們應當手工賦值。如下所示:
CTime m_time;
m_time=NULL;#p#副標題#e#
3.3 總結
VisualC++中的ODBC類庫可以幫助程序員完成絕大多數(shù)的數(shù)據(jù)庫操作。利用ODBC技術使得程序員從具體的DBMS中解脫出來,從而極大的減少了軟件開發(fā)的工作量,縮短開發(fā)周期,提高了效率和軟件的可靠性。
4、使用DAO
4.1 概述
Visual C++提供了對DAO的封裝,MFC DAO類封裝了DAO(數(shù)據(jù)庫訪問對象)的大部分功能,從面Visual C++程序就可以使用Visual C++提供的MFC DAO類方便的訪問Microsoft Jet 數(shù)據(jù)庫,編制簡潔、有Visaul C++特色的數(shù)據(jù)庫應用程序。
數(shù)據(jù)庫訪問對象(DAO)提供了一種通過程序代碼創(chuàng)建和操縱數(shù)據(jù)庫的機制。多個DAO對象構成一個體系結構,在這個結構里,各個DAO對象協(xié)同工作。DAO支持以下四個數(shù)據(jù)庫選項:
打開訪問數(shù)據(jù)庫(MDB文件)——MDB文件是一個自包含的數(shù)據(jù)庫,它包括查詢定義、安全信息、索引、關系,當然還有實際的數(shù)據(jù)表。用戶只須指定MDB文件的路徑名。
直接打開ODBC數(shù)據(jù)源——這里有一個很重要的限制。不能找開以Jet引擎作為驅動程序的ODBC數(shù)據(jù)源;只可以使用具有自己的ODBC驅動程序DLL的數(shù)據(jù)源。
用Jet引擎找開ISAM型(索引順序訪問方法)數(shù)據(jù)源(包括dBase,FoxPro,Paradox,Btrieve,Excel或文本文件)——即使已經(jīng)設置了ODBC數(shù)據(jù)源,要用Jet引擎來訪問這些文件類型中的一種,也必須以ISAM型數(shù)據(jù)源的方式來找開文件,而不是以ODBC數(shù)據(jù)源的方式。
給ACCESS數(shù)據(jù)庫附加外部表——這實際上是用DAO訪問ODBC數(shù)據(jù)源的首選方法。首先使用ACCESS把ODBC表添加到一個MDB文件上,然后依照之一選項中介紹的方法用DAO找開這個MDB文件就可以了。用戶也可以用ACCESS把IA文件附加到一個MDB文件上。
4.2 應用DAO編程
4.21 打開數(shù)據(jù)庫
CDaoWorkspace對象代表一個DAO Workspace對象,在MFC DAO體系結構中處于更高處,定義了一個用戶的同數(shù)據(jù)庫的會話,并包含打開的數(shù)據(jù)庫,負責完成數(shù)據(jù)庫的事務處理。我們可以使用隱含的workspace對象。
CDaoDatabase對象代表了一個到數(shù)據(jù)庫的連接,在MFC中,是通過CDaoDatabase封裝的。
在構造CDaoDatabase對象時,有如下兩種方法:
創(chuàng)建一個CDaoDatabase對象,并向其傳遞一個指向一個已經(jīng)找開的CdaoWorkspace對象的指針。
創(chuàng)建一個CDaoDatabase對象,而不明確地指定使用的workspace,此時,MFC將創(chuàng)建一個新的臨時的CDaoWorkspace對象。
如下代碼所示:
CDaoDatabase db;
db.Open(“test.mdb”,FALSE,FALSE,_T(“”);
其中參數(shù)一包括要打開的文件的全路徑名。
4.22 查詢記錄
一個DAO recordset對象,代表一個數(shù)據(jù)記錄的,該是一個庫表或者是一個查詢的運行結果中的全部記錄。CDaoRecorset對象有三種類型:表、動態(tài)集、快照。
通常情況下,我們在應用程序中可以使用CDaoRecordset的導出類,這一般是通過ClassWizard或AppWizard來生成的。但我們也可以直接使用CDaoRecordset類生成的對象。此時,我們可以動態(tài)地綁定recordset對象的數(shù)據(jù)成員。
如下代碼所示:
COleVariant var;
long id;
CString str;
CDaoRecordset m_Set(db);
m_Set.Open(“查詢的SQL語句”);
while(!m_Set.IsEOF())
{
/*
處理
m_Set.GetFieldValue(“ID”,var);
id=V_I4(var);
m_Set.GetFieldValue(“Name”,var);
str=var.pbVal;
*/
m_Set.MoveNext();
}
m_Set.Close();
4.23 添加記錄
添加記錄用AddNew函數(shù),此時用SetFieldValue來進行賦值。
如下代碼所示:
m_pDaoRecordset-AddNew ();
sprintf(strValue,”%s”,m_UserName );
m_pDaoRecordset-SetFieldValue (“UserName”,strValue);
sprintf(strValue,”%d”,m_PointId );
m_pDaoRecordset-SetFieldValue (“PointId”,strValue);
dataSrc.SetDateTime (m_UpdateTime .GetYear ),m_UpdateTime .GetMonth ),m_UpdateTime .GetDay (),
m_UpdateTime .GetHour (),m_UpdateTime .GetMinute (),m_UpdateTime .GetSecond ());
valValue=dataSrc;
m_pDaoRecordset-SetFieldValue (“UpdateTime”,valValue);
sprintf(strValue,”%f”,m_pRecordset-m_OldValue );
m_pDaoRecordset-SetFieldValue (“OldValue”,strValue);
sprintf(strValue,”%f”,m_pRecordset-m_NewValue );
m_pDaoRecordset-SetFieldValue (“NewValue”,strValue);
m_pDaoRecordset-Update ();
此時,要注意,日期時間型數(shù)據(jù)要用SetDataTime函數(shù)來賦值,這里面要用到COleVariant類型數(shù)據(jù),具體用法可以參考有關幫助。
4.24 修改記錄
修改記錄用Edit()函數(shù),把記錄定位到要修改的位置,調用Edit函數(shù),修改完成后,調用Update函數(shù)。
如下代碼所示:
m_Set.Edit();
m_Set.SetFieldValue(“列名”,”字符串”);
m_Set.Update();
4.25 刪除記錄
刪除記錄用Delete()函數(shù),使用后不需調用Update()函數(shù)。
4.26 統(tǒng)計記錄
可以使用如下代碼來統(tǒng)計記錄數(shù):
COleVariant varValue;
CDaoRecordset m_Set(db);
m_Set.Open(dbOpenDynaset,”SQL語句”);
varValue=m_Set.GetFieldValue(0);
m_lMaxCount=V_I4(varValue);
m_Set.Close();
如果是統(tǒng)計一張表中總記錄,可以使用CDaoTableDef對象,如下代碼所示:
CDaoTableDef m_Set(gUseDB);
Count=m_Set.GetRecordCount();
m_Set.Close();
不能用CDaoRecordset對象的GetRecordCount()來取得記錄數(shù)。
4.3 總結
使用DAO技術可以便我們方便的訪問Microsoft Jet引擎數(shù)據(jù)庫,由于Microsoft Jet不支持多線程,因此,必須限制調用到應用程序主線程的所有DAO。
5 使用OLE DB
5.1 概述
OLE DB的存在為用戶提供了一種統(tǒng)一的方法來訪問所有不同種類的數(shù)據(jù)源。OLE DB可以在不同的數(shù)據(jù)源中進行轉換。利用OLE DB,客戶端的開發(fā)人員在進行數(shù)據(jù)訪問時只需把精力集中在很少的一些細節(jié)上,而不必弄懂大量不同數(shù)據(jù)庫的訪問協(xié)議。
OLE DB是一套通過COM接口訪問數(shù)據(jù)的ActiveX接口。這個OLE DB接口相當通用,足以提供一種訪問數(shù)據(jù)的統(tǒng)一手段,而不管存儲數(shù)據(jù)所使用的方法如何。同時,OLE DB還允許開發(fā)人員繼續(xù)利用基礎數(shù)據(jù)庫技術的優(yōu)點,而不必為了利用這些優(yōu)點而把數(shù)據(jù)移出來。
5.2 使用ATL使用OLE DB數(shù)據(jù)使用程序
由于直接使用OLE DB的對象和接口設計數(shù)據(jù)庫應用程序需要書寫大量的代碼。為了簡化程序設計,Visual C++提供了ATL模板用于設計OLE DB數(shù)據(jù)應用程序和數(shù)據(jù)提供程序。
利用ATL模板可以很容易地將OLE DB與MFC結合起來,使數(shù)據(jù)庫的參數(shù)查詢等復雜的編程得到簡化。MFC提供的數(shù)據(jù)庫類使OLE DB的編程更具有面向對象的特性。Viual C++所提供用于OLE DB的ATL模板可分為數(shù)據(jù)提供程序的模板和數(shù)據(jù)使用程序的模板。
使用ATL模板創(chuàng)建數(shù)據(jù)應用程序一般有以下幾步驟:
創(chuàng)建應用框架
加入ATL產(chǎn)生的模板類
在應用中使用產(chǎn)生的數(shù)據(jù)訪問對象
不用ATL使用OLE DB數(shù)據(jù)使用程序
利用ATL模板產(chǎn)生數(shù)據(jù)使用程序較為簡單,但適用性不廣,不能動態(tài)適應數(shù)據(jù)庫的變化。下面我們介紹直接使用MFC OLE DB類來生成數(shù)據(jù)使用程序。
模板的使用
OLE DB數(shù)據(jù)使用者模板是由一些模板組成的,包括如下一些模板,下面對一些常用類作一些介紹。
會話類
CDataSource類
CDataSource類與OLE DB的數(shù)據(jù)源對象相對應。這個類代表了OLE DB數(shù)據(jù)提供程序和數(shù)據(jù)源之間的連接。只有當數(shù)據(jù)源的連接被建立之后,才能產(chǎn)生會話對象,可以調用Open來打開數(shù)據(jù)源的連接。
CSession類
CSession所創(chuàng)建的對象代表了一個單獨的數(shù)據(jù)庫訪問的會話。一個用CDataSource類產(chǎn)生的數(shù)據(jù)源對象可以創(chuàng)建一個或者多個會話,要在數(shù)據(jù)源對象上產(chǎn)生一個會話對象,需要調用函數(shù)Open()來打開。同時,會話對象還可用于創(chuàng)建事務操作。
CEnumeratorAccessor類
CEnumeratorAccessor類是用來訪問枚舉器查詢后所產(chǎn)生的行集中可用數(shù)據(jù)提供程序的信息的訪問器,可提供當前可用的數(shù)據(jù)提供程序和可見的訪問器。
訪問器類
CAcessor類
CAccessor類代表與訪問器的類型。當用戶知道數(shù)據(jù)庫的類型和結構時,可以使用此類。它支持對一個行集采用多個訪問器,并且,存放數(shù)據(jù)的緩沖區(qū)是由用戶分配的。
CDynamicAccessor類
關于c 數(shù)據(jù)庫參數(shù)傳遞的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。
成都創(chuàng)新互聯(lián)建站主營:成都網(wǎng)站建設、網(wǎng)站維護、網(wǎng)站改版的網(wǎng)站建設公司,提供成都網(wǎng)站制作、成都網(wǎng)站建設、成都網(wǎng)站推廣、成都網(wǎng)站優(yōu)化seo、響應式移動網(wǎng)站開發(fā)制作等網(wǎng)站服務。
網(wǎng)站題目:C語言中數(shù)據(jù)庫參數(shù)傳遞方法簡介(c數(shù)據(jù)庫參數(shù)傳遞)
文章分享:http://m.fisionsoft.com.cn/article/cohpcci.html


咨詢
建站咨詢
