日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C語言中數(shù)據(jù)庫參數(shù)傳遞方法簡介(c數(shù)據(jù)庫參數(shù)傳遞)

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

一. 使用結(jié)構(gòu)體

結(jié)構(gòu)體是一種C語言中常用的數(shù)據(jù)結(jié)構(gòu),用于存儲不同數(shù)據(jù)類型的值。當(dāng)在C語言中處理數(shù)據(jù)庫時,您可以使用結(jié)構(gòu)體來存儲和快速訪問連接和查詢字符串. 下面是使用一個結(jié)構(gòu)體來管理數(shù)據(jù)庫參數(shù)的示例:

“`

struct DatabaseParams {

char *host;

char *user;

char *password;

char *database;

};

“`

在上面的代碼中,我們定義了一個名為DatabaseParams的結(jié)構(gòu)體,該結(jié)構(gòu)體包含四個字符型的指針類型的成員變量。host表示數(shù)據(jù)庫所在的主機(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í)行查詢操作,關(guān)閉數(shù)據(jù)庫連接等。通過在函數(shù)調(diào)用時傳遞參數(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ù)來分別打開和關(guān)閉數(shù)據(jù)庫并執(zhí)行查詢操作。在打開數(shù)據(jù)庫函數(shù)open_database中,我們接受四個不同的參數(shù):主機(jī)名,登錄用戶名,密碼和數(shù)據(jù)庫名稱。這些參數(shù)在打開數(shù)據(jù)庫連接時被使用,并由該函數(shù)告知成功或失敗反饋。您可以使用類似的方法來為其他操作設(shè)計更多的函數(shù),例如執(zhí)行SQL命令。

三. 使用動態(tài)鏈接庫(DLL)

使用動態(tài)鏈接庫是一種提供多種數(shù)據(jù)庫連接和查詢功能的強(qiáng)大方法。動態(tài)鏈接庫可以讓您使用其他人編寫的庫并從您的程序中調(diào)用函數(shù)。您可以調(diào)用連接和查詢函數(shù)以訪問一個特定的數(shù)據(jù)庫和數(shù)據(jù)。這種方法可以在不同的平臺和編譯器上使用,并被廣泛應(yīng)用于許多開源數(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ù)來關(guān)閉連接并釋放句柄。

相關(guān)問題拓展閱讀:

  • c語言怎么把鏈表數(shù)據(jù)寫進(jìn)mysql
  • 用C編寫數(shù)據(jù)庫怎么寫
  • 用Visual C++開發(fā)數(shù)據(jù)庫應(yīng)用程序()

c語言怎么把鏈表數(shù)據(jù)寫進(jìn)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ù)進(jìn)行if測試,如果初始化或者連接出錯,作出相應(yīng)提示,以便調(diào)試。

5.對數(shù)據(jù)庫的操作:

Mysql_query(&mysql,“select*fromtestdbwherecondition”);

我們在實際操作中,為了更方便的使用程序中的某些變量,我們將會用到一個函數(shù):

intsprintf(char*str,constchar*format,?);

這個函數(shù)用來格式化我們的字符串,然后將變量按照給你的格式,賦給之一個參數(shù)。

我們使用這個方法方法可以很方便的使用我們的變量來對數(shù)據(jù)庫進(jìn)行操作。例如我們將要進(jìn)行數(shù)據(jù)庫的查詢操作,我們就可以這樣使用:

sprintf(sql,”select*fromtestdbwhereusername=‘%s’”,u_name);

然后使用mysql_query(&mysql,sql)進(jìn)行查詢。

MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQLAB公司開發(fā),屬于Oracle旗下產(chǎn)品。MySQL是更流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在WEB應(yīng)用方面,MySQL是更好的RDBMS(RelationalDatabaseManagementSystem,關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一。

用C編寫數(shù)據(jù)庫怎么寫

一個萬能的DBHelper就可以解決都事情,直接對數(shù)據(jù)庫中的存儲過程進(jìn)行調(diào)用,只需要傳入?yún)?shù)就可以和你調(diào)用的存儲過程就可以。有關(guān)萬能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ù)進(jìn)行查詢時候調(diào)用的

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ù)進(jìn)行增刪改時候調(diào)用的

public static int ExecuteCommand(string sql)

{

SqlCommand cmd = new SqlCommand(sql,connection);

int resualt = cmd.ExecuteNonQuery();

return resualt;

}

}

}

用Visual C++開發(fā)數(shù)據(jù)庫應(yīng)用程序()

3、 使用MFC訪問ODBC數(shù)據(jù)源

3.1 概述

VisualC++的MFC類庫定義了幾個數(shù)據(jù)庫類。在利用ODBC編程時,經(jīng)常要使用到CDatabase(數(shù)據(jù)庫類),CRecordSet(記錄集類)和CRecordView(可視記錄集類)。 其中:

CDatabase類對象提供了對數(shù)據(jù)源的連接,通過它你可以對數(shù)據(jù)源進(jìn)行操作。

CRecordView類對象能以控制的形式 顯示數(shù)據(jù)庫記錄。這個視圖是直接連到一個CRecordSet對象的表視圖。

CRecordSet類對象提供了從數(shù)據(jù)源 中提取出的記錄集。CRecordSet對象通常用于兩種形式: 動態(tài)行集(dynasets)和快照集(snapshots)。動態(tài)行集能保 持與其他用戶所做的更改保持同步??煺占瘎t是數(shù)據(jù)的一個靜態(tài)視圖。每一種形式在記錄集被打開時都提供一組記錄,所不同的是,當(dāng)你在一個動態(tài)行集里滾 動到一條記錄時,由其他用戶或是你應(yīng)用程序中的其他記錄集對該記錄所做的更改會相應(yīng)地顯示出來。腔吵

Visual C++提供了幾種記錄集,可以用來定制應(yīng)用程序的工作方式。查看這些不同選項的最快方式要兼顧速度和特征。你會發(fā)現(xiàn),在很多情況下,如果想添加特征,就必須付出程序執(zhí)行速度降低的代價。下面告訴你一些可以自由支配的記錄集選項。更重要的是,要告訴你從這個選項可以獲得更快的速度還是更多的特征。

1、Snapshot(快照) 這個選項要Visual C++在一次快照中下載整個查詢。換言之,及時快速地給數(shù)據(jù)庫內(nèi)容拍照,并把它作為未來工作的基礎(chǔ)。這種方法有三個缺點(diǎn)。之一,你看不到別人在網(wǎng)絡(luò)上做的更新,這可能意味著你的決定是建立在老信息的基礎(chǔ)上。第二,一次就下載所有這些記錄,這意味著在下載期間給網(wǎng)絡(luò)增加了沉重的負(fù)擔(dān)。第三,記錄下載時用戶會結(jié)束等待,這意味著網(wǎng)絡(luò)的呼叫性能變得更低。然而這種方法也有兩個優(yōu)點(diǎn)。之一,記錄一旦被下載,該工作站所需的網(wǎng)絡(luò)活動幾乎就沒有了棗這為其它請求釋放了帶寬。總之,你會看到網(wǎng)絡(luò)的吞吐量增大了。第二,因為所有被申請的記錄都在用戶的機(jī)器上,所以用戶實際上會得到應(yīng)用程序更佳的總體性能。你可能想把快照的方法限制在較小的數(shù)據(jù)庫上使用,原因在于快照適用于用戶請求信息而不適用于數(shù)據(jù)編輯會話。

2、Dynaset(動態(tài)集) 使用這個選項時,Visual C++創(chuàng)建指向所請求的每個記錄的實際指針。另外,只有填充屏幕時實際需要的記錄是從服務(wù)器上下載來的。這種方法的好處很明顯。幾乎馬上就能在屏幕上看到記錄。而且還會看到其它用戶對數(shù)據(jù)庫所做的更改。最后,其它用戶也會看到你做的更改,因為動態(tài)集在你更改記錄時被上載到服務(wù)器上。很明顯,這種方法要求對服務(wù)器的實時訪問,它槐脊減小了網(wǎng)絡(luò)總吞吐量并降低了應(yīng)用程序的性能。這個選項適合于創(chuàng)建用戶要花費(fèi)很多時間來編輯數(shù)據(jù)的應(yīng)用程序。同時,它也是大型數(shù)據(jù)庫的更佳選擇,原因在于只需下載用戶實際需要的信息。

3.2 應(yīng)用ODBC編程

可以應(yīng)用AppWizard來建立一個ODBC的應(yīng)用程序框架,也可以直接使用ODBC來進(jìn)行數(shù)據(jù)庫編程,這時,應(yīng)包括頭文鉛圓滲件afxdb.h。

應(yīng)用ODBC編程兩個最重要的類是CDatabase和CRecordSet,但在應(yīng)用程序中,不應(yīng)直接使用CRecordSet類,而必須從CRecordSet類產(chǎn)生一個導(dǎo)出類,并添加相應(yīng)于數(shù)據(jù)庫表中字段的成員變量。隨后,重載CRecordset類的成員函數(shù)DoFieldExchange,該函數(shù)通過使用RFX函數(shù)完成數(shù)據(jù)庫字段與記錄集域數(shù)據(jù)成員變量的數(shù)據(jù)交換,RFX函數(shù)同對話框數(shù)據(jù)交換(DDX)機(jī)制相類似,負(fù)責(zé)完成數(shù)據(jù)庫與成員變量間的數(shù)據(jù)交換。

下面舉例說明在VisualC++環(huán)境中ODBC 的編程技巧:

3.21 數(shù)據(jù)庫連接

在CRecordSet類中定義了一個成員變 量m_pDatabase:

CDatabase *m_pDatabase;

它是指向?qū)ο髷?shù)據(jù)庫類的指針。如果在CRecordSet類對象調(diào)用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 復(fù) 用m_db 對 象

m_set2.m_pDatabse=m_db; // m_set2 復(fù) 用m_db 對 象

或如下:

Cdatabase db;

db.Open(“Database”); //建立ODBC連接

CrecordSet m_set(db); //構(gòu)造記錄集對象,使數(shù)據(jù)庫指向db

3.22 查詢記錄

查詢記錄使用CRecordSet::Open()和 CRecordSet::Requery()成員函數(shù)。在使用CRecordSet類對象之前,必須使用 CRecordSet::Open()函數(shù)來獲得有效的記錄集。一旦已經(jīng)使用過CRecordSet::Open() 函數(shù),再次查詢時就可以應(yīng)用CRecordSet::Requery()函數(shù)。在調(diào) 用CRecordSet::Open()函數(shù)時,如果已經(jīng)將一個已經(jīng)打開的CDatabase 對象指針傳給CRecordSet類對象的m_pDatabase成員變量,則使 用該數(shù)據(jù)庫對象建立ODBC連接;否則如果m_pDatabase為空指 針,就新建一個CDatabase類對象并使其與缺省的數(shù)據(jù)源 相連,然后進(jìn)行CRecordSet類對象的初始化。缺省數(shù)據(jù)源 由GetDefaultConnect()函數(shù)獲得。你也可以提供你所需要的SQL 語句,并以它來調(diào)用CRecordSet::Open()函數(shù),例如:

m_Set.Open(AFX_DATABASE_USE_DEFAULT,strSQL);

如果沒有指定參數(shù),程序則使 用缺省的SQL語句,即對在GetDefaultSQL()函數(shù)中指定的SQL語 句進(jìn)行操作:

CString CTestRecordSet::GetDefaultSQL()

{return _T(“,”);}

對于GetDefaultSQL()函數(shù)返回的表名, 對應(yīng)的缺省操作是SELECT語句,即:

SELECT * FROM BasicData,MainSize

查詢過程中也可以利用CRecordSet的 成員變量m_strFilter和m_strSort來執(zhí)行條件查詢和結(jié)果排序。m_strFilter 為過濾字符串,存放著SQL語句中WHERE后的條件串;m_strSort 為排序字符串,存放著SQL語句中ORDERBY后的字符串。 如:

m_Set.m_strFilter=”TYPE=’電動機(jī)'”;

m_Set.m_strSort=”VOLTAGE”;

m_Set.Requery();

對應(yīng)的SQL語句為:

SELECT * FROM BasicData,MainSize

WHERE TYPE=’電動機(jī)’

ORDER BY VOLTAGE

除了直接賦值給m_strFilter以外,還 可以使用參數(shù)化。利用參數(shù)化可以更直觀,更方便地 完成條件查詢?nèi)蝿?wù)。使用參數(shù)化的步驟如下:

(1).聲明參變量:

Cstring p1;

Float p2;

(2).在構(gòu)造函數(shù)中初始化參變量

p1=_T(“”);

p2=0.0f;

m_nParams=2;

(3).將參變量與對應(yīng)列綁定

pFX-SetFieldType(CFieldExchange::param)

RFX_Text(pFX,_T(“P1”),p1);

RFX_Single(pFX,_T(“P2”),p2);

完成以上步驟之后就可以利用參變量進(jìn)行條件查詢了:

m_pSet-m_strFilter=”TYPE=?ANDVOLTAGE=?”;

m_pSet-p1=”電動機(jī)”;

m_pSet-p2=60.0;

m_pSet-Requery();

參變量的值按綁定的順序替換 查詢字串中的“?”適配符。

如果查詢的結(jié)果是多條記錄的 話,可以用CRecordSet類的函數(shù)Move(),MoveNext(),MovePrev(),MoveFirst() 和MoveLast()來移動光標(biāo)。

3.23 增加記錄

增加記錄使用AddNew()函數(shù),要求數(shù)據(jù)庫必須是以允許增加的方式打開:

m_pSet-AddNew(); //在表的末尾增加新記錄

m_pSet-SetFieldNull((m_pSet-m_type),FALSE);

m_pSet-m_type=”電動機(jī)”;

… //輸入新的字段值

m_pSet- Update(); //將新記錄存入數(shù)據(jù)庫

m_pSet-Requery(); //重建記錄集

3.24 刪除記錄

直接使用Delete()函數(shù),并且在調(diào)用Delete() 函數(shù)之后不需調(diào)用Update()函數(shù):

m_pSet-Delete();

if(!m_pSet-IsEOF())

m_pSet-MoveNext();

else

m_pSet-MoveLast();

3.25 修改記錄

修改記錄使用Edit()函數(shù):

m_pSet-Edit(); //修改當(dāng)前記錄

m_pSet-m_type=”發(fā)電機(jī)”; //修改當(dāng)前記錄字段值

m_pSet-Update(); //將修改結(jié)果存入數(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語句,但是有的時候我們還想進(jìn)行一些其他操 作,例如建立新表,刪除表,建立新的字段等等,這 時就需要使用到CDatabase類的直接執(zhí)行SQL語句的機(jī)制。通 過調(diào)用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;

}

應(yīng)當(dāng)指出的是,由于不同DBMS提 供的數(shù)據(jù)操作語句不盡相同,直接執(zhí)行SQL語句可能會破壞軟件的DBMS無關(guān)性,因此在應(yīng)用中應(yīng)當(dāng)慎用此類操作。

3.28 注意

從CRecordSet導(dǎo)出的類中如果包含DataTime類型的數(shù)據(jù),在VC中是用CTime類型來替代的,這時,構(gòu)造函數(shù)沒有賦于缺省值。這時,我們應(yīng)當(dāng)手工賦值。如下所示:

CTime m_time;

m_time=NULL;#p#副標(biāo)題#e#

3.3 總結(jié)

VisualC++中的ODBC類庫可以幫助程序員完成絕大多數(shù)的數(shù)據(jù)庫操作。利用ODBC技術(shù)使得程序員從具體的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ù)庫應(yīng)用程序。

數(shù)據(jù)庫訪問對象(DAO)提供了一種通過程序代碼創(chuàng)建和操縱數(shù)據(jù)庫的機(jī)制。多個DAO對象構(gòu)成一個體系結(jié)構(gòu),在這個結(jié)構(gòu)里,各個DAO對象協(xié)同工作。DAO支持以下四個數(shù)據(jù)庫選項:

打開訪問數(shù)據(jù)庫(MDB文件)——MDB文件是一個自包含的數(shù)據(jù)庫,它包括查詢定義、安全信息、索引、關(guān)系,當(dāng)然還有實際的數(shù)據(jù)表。用戶只須指定MDB文件的路徑名。

直接打開ODBC數(shù)據(jù)源——這里有一個很重要的限制。不能找開以Jet引擎作為驅(qū)動程序的ODBC數(shù)據(jù)源;只可以使用具有自己的ODBC驅(qū)動程序DLL的數(shù)據(jù)源。

用Jet引擎找開ISAM型(索引順序訪問方法)數(shù)據(jù)源(包括dBase,FoxPro,Paradox,Btrieve,Excel或文本文件)——即使已經(jīng)設(shè)置了ODBC數(shù)據(jù)源,要用Jet引擎來訪問這些文件類型中的一種,也必須以ISAM型數(shù)據(jù)源的方式來找開文件,而不是以O(shè)DBC數(shù)據(jù)源的方式。

給ACCESS數(shù)據(jù)庫附加外部表——這實際上是用DAO訪問ODBC數(shù)據(jù)源的首選方法。首先使用ACCESS把ODBC表添加到一個MDB文件上,然后依照之一選項中介紹的方法用DAO找開這個MDB文件就可以了。用戶也可以用ACCESS把IA文件附加到一個MDB文件上。

4.2 應(yīng)用DAO編程

4.21 打開數(shù)據(jù)庫

CDaoWorkspace對象代表一個DAO Workspace對象,在MFC DAO體系結(jié)構(gòu)中處于更高處,定義了一個用戶的同數(shù)據(jù)庫的會話,并包含打開的數(shù)據(jù)庫,負(fù)責(zé)完成數(shù)據(jù)庫的事務(wù)處理。我們可以使用隱含的workspace對象。

CDaoDatabase對象代表了一個到數(shù)據(jù)庫的連接,在MFC中,是通過CDaoDatabase封裝的。

在構(gòu)造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ù)記錄的,該是一個庫表或者是一個查詢的運(yùn)行結(jié)果中的全部記錄。CDaoRecorset對象有三種類型:表、動態(tài)集、快照。

通常情況下,我們在應(yīng)用程序中可以使用CDaoRecordset的導(dǎo)出類,這一般是通過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來進(jìn)行賦值。

如下代碼所示:

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ù),具體用法可以參考有關(guān)幫助。

4.24 修改記錄

修改記錄用Edit()函數(shù),把記錄定位到要修改的位置,調(diào)用Edit函數(shù),修改完成后,調(diào)用Update函數(shù)。

如下代碼所示:

m_Set.Edit();

m_Set.SetFieldValue(“列名”,”字符串”);

m_Set.Update();

4.25 刪除記錄

刪除記錄用Delete()函數(shù),使用后不需調(diào)用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 總結(jié)

使用DAO技術(shù)可以便我們方便的訪問Microsoft Jet引擎數(shù)據(jù)庫,由于Microsoft Jet不支持多線程,因此,必須限制調(diào)用到應(yīng)用程序主線程的所有DAO。

5 使用OLE DB

5.1 概述

OLE DB的存在為用戶提供了一種統(tǒng)一的方法來訪問所有不同種類的數(shù)據(jù)源。OLE DB可以在不同的數(shù)據(jù)源中進(jìn)行轉(zhuǎn)換。利用OLE DB,客戶端的開發(fā)人員在進(jìn)行數(shù)據(jù)訪問時只需把精力集中在很少的一些細(xì)節(jié)上,而不必弄懂大量不同數(shù)據(jù)庫的訪問協(xié)議。

OLE DB是一套通過COM接口訪問數(shù)據(jù)的ActiveX接口。這個OLE DB接口相當(dāng)通用,足以提供一種訪問數(shù)據(jù)的統(tǒng)一手段,而不管存儲數(shù)據(jù)所使用的方法如何。同時,OLE DB還允許開發(fā)人員繼續(xù)利用基礎(chǔ)數(shù)據(jù)庫技術(shù)的優(yōu)點(diǎn),而不必為了利用這些優(yōu)點(diǎn)而把數(shù)據(jù)移出來。

5.2 使用ATL使用OLE DB數(shù)據(jù)使用程序

由于直接使用OLE DB的對象和接口設(shè)計數(shù)據(jù)庫應(yīng)用程序需要書寫大量的代碼。為了簡化程序設(shè)計,Visual C++提供了ATL模板用于設(shè)計OLE DB數(shù)據(jù)應(yīng)用程序和數(shù)據(jù)提供程序。

利用ATL模板可以很容易地將OLE DB與MFC結(jié)合起來,使數(shù)據(jù)庫的參數(shù)查詢等復(fù)雜的編程得到簡化。MFC提供的數(shù)據(jù)庫類使OLE DB的編程更具有面向?qū)ο蟮奶匦?。Viual C++所提供用于OLE DB的ATL模板可分為數(shù)據(jù)提供程序的模板和數(shù)據(jù)使用程序的模板。

使用ATL模板創(chuàng)建數(shù)據(jù)應(yīng)用程序一般有以下幾步驟:

創(chuàng)建應(yīng)用框架

加入ATL產(chǎn)生的模板類

在應(yīng)用中使用產(chǎn)生的數(shù)據(jù)訪問對象

不用ATL使用OLE DB數(shù)據(jù)使用程序

利用ATL模板產(chǎn)生數(shù)據(jù)使用程序較為簡單,但適用性不廣,不能動態(tài)適應(yīng)數(shù)據(jù)庫的變化。下面我們介紹直接使用MFC OLE DB類來生成數(shù)據(jù)使用程序。

模板的使用

OLE DB數(shù)據(jù)使用者模板是由一些模板組成的,包括如下一些模板,下面對一些常用類作一些介紹。

會話類

CDataSource類

CDataSource類與OLE DB的數(shù)據(jù)源對象相對應(yīng)。這個類代表了OLE DB數(shù)據(jù)提供程序和數(shù)據(jù)源之間的連接。只有當(dāng)數(shù)據(jù)源的連接被建立之后,才能產(chǎn)生會話對象,可以調(diào)用Open來打開數(shù)據(jù)源的連接。

CSession類

CSession所創(chuàng)建的對象代表了一個單獨(dú)的數(shù)據(jù)庫訪問的會話。一個用CDataSource類產(chǎn)生的數(shù)據(jù)源對象可以創(chuàng)建一個或者多個會話,要在數(shù)據(jù)源對象上產(chǎn)生一個會話對象,需要調(diào)用函數(shù)Open()來打開。同時,會話對象還可用于創(chuàng)建事務(wù)操作。

CEnumeratorAccessor類

CEnumeratorAccessor類是用來訪問枚舉器查詢后所產(chǎn)生的行集中可用數(shù)據(jù)提供程序的信息的訪問器,可提供當(dāng)前可用的數(shù)據(jù)提供程序和可見的訪問器。

訪問器類

CAcessor類

CAccessor類代表與訪問器的類型。當(dāng)用戶知道數(shù)據(jù)庫的類型和結(jié)構(gòu)時,可以使用此類。它支持對一個行集采用多個訪問器,并且,存放數(shù)據(jù)的緩沖區(qū)是由用戶分配的。

CDynamicAccessor類

關(guān)于c 數(shù)據(jù)庫參數(shù)傳遞的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

成都創(chuàng)新互聯(lián)建站主營:成都網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、網(wǎng)站改版的網(wǎng)站建設(shè)公司,提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、成都網(wǎng)站推廣、成都網(wǎng)站優(yōu)化seo、響應(yīng)式移動網(wǎng)站開發(fā)制作等網(wǎng)站服務(wù)。


文章名稱:C語言中數(shù)據(jù)庫參數(shù)傳遞方法簡介(c數(shù)據(jù)庫參數(shù)傳遞)
當(dāng)前地址:http://m.5511xx.com/article/cohpcci.html