在VC中用ODBC訪問SQL Server數(shù)據(jù)庫(kù)_第1頁(yè)
在VC中用ODBC訪問SQL Server數(shù)據(jù)庫(kù)_第2頁(yè)
在VC中用ODBC訪問SQL Server數(shù)據(jù)庫(kù)_第3頁(yè)
在VC中用ODBC訪問SQL Server數(shù)據(jù)庫(kù)_第4頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、在vc+中用odbc訪問sql server數(shù)據(jù)庫(kù) odbc(open database connectivity,開放數(shù)據(jù)庫(kù)連接)是由microsoft定義的一種數(shù)據(jù)庫(kù)訪問標(biāo)準(zhǔn),它提供了一種標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)訪問方法以訪問不同數(shù)據(jù)庫(kù)提供商的數(shù)據(jù)庫(kù),其本質(zhì)上是一組數(shù)據(jù)庫(kù)訪問api。雖然數(shù)據(jù)庫(kù)訪問有多種方法,但odbc以其編程相對(duì)簡(jiǎn)單,在實(shí)際編程中被廣泛使用。 vc+中提供了一組封裝了odbc api的mfc odbc類,以減少程序代碼編寫量。在vc+中使用mfc odbc類訪問數(shù)據(jù)庫(kù)時(shí),一般都是先配置或選擇已有的數(shù)據(jù)源,再構(gòu)造cdatabase類對(duì)象,打開數(shù)據(jù)源,用該數(shù)據(jù)庫(kù)類對(duì)象和sql(結(jié)構(gòu)化查詢

2、語(yǔ)言)可以對(duì)庫(kù)進(jìn)行訪問,再構(gòu)造crecordset類或其繼承類對(duì)象,用數(shù)據(jù)集類對(duì)象和sql可以實(shí)現(xiàn)對(duì)庫(kù)中的表的操作。在vc+中用mfc odbc類操作sql server數(shù)據(jù)庫(kù)基本上也是這個(gè)思路。1.配置數(shù)據(jù)源在程序中根據(jù)用戶選擇動(dòng)態(tài)配置數(shù)據(jù)源而不調(diào)用odbc數(shù)據(jù)源管理器,對(duì)于應(yīng)用程序開發(fā)有時(shí)是十分必要的。畢竟odbc數(shù)據(jù)源管理器對(duì)于對(duì)數(shù)據(jù)庫(kù)不熟悉的用戶顯的復(fù)雜了,且odbc數(shù)據(jù)源管理器的界面風(fēng)格有可能與整個(gè)應(yīng)用程序的界面風(fēng)格不一致,對(duì)于嚴(yán)謹(jǐn)?shù)膽?yīng)用程序開發(fā)者來(lái)說(shuō),這些都是不能容忍的。配置sql server數(shù)據(jù)源時(shí),必須有sql server服務(wù)器名和服務(wù)器中的目標(biāo)數(shù)據(jù)庫(kù)名(否則打開該數(shù)據(jù)源時(shí)

3、,就會(huì)彈出配置數(shù)據(jù)源對(duì)話框或失敗)。這與配置access等數(shù)據(jù)庫(kù)的數(shù)據(jù)源時(shí)指定數(shù)據(jù)庫(kù)文件的路徑不同??梢酝ㄟ^odbc api函數(shù)sqlbrowseconnect得到本地所有的sql server服務(wù)器、服務(wù)器中的庫(kù)、語(yǔ)言信息等。其使用方法如下所示:得到服務(wù)器名 sqlbrowseconnect(hdbc, driver=sql server;, sql_nts, browseresult, sizeof(browseresult), &browseresultlen);其中hdbc是用sqlallochandle函數(shù)得到的連結(jié)句柄,第二個(gè)參數(shù)是指定連結(jié)屬性的輸入字符串,第三個(gè)參數(shù)是輸入字符串的

4、長(zhǎng)度,第四個(gè)參數(shù)是輸出字符串的指針,我們要得到的信息就存于這個(gè)字符串中,第五個(gè)參數(shù)指定輸出字符串的長(zhǎng)度,第六個(gè)參數(shù)是實(shí)際返回字符串的長(zhǎng)度。browseresult所指向的函數(shù)返回的字符串中含有形如“server:server=server_name1,server_name2,”的字符串,其中server_name1、server_name2就是sql server服務(wù)器名。得到庫(kù)名當(dāng)用戶選定一個(gè)服務(wù)器之后,可以進(jìn)一步利用sqlbrowseconnect函數(shù)得到服務(wù)器中存在的庫(kù)或語(yǔ)言信息(如果需要的話)。sqlbrowseconnect(hdbc,server=server_name1;uid

5、=sa;pwd=515578;,sql_nts, browseresult, sizeof(browseresult), &browseresultlen);其中uid和pwd是訪問該服務(wù)器的用戶名和密碼。這次browseresult所指向的函數(shù)返回的字符串中含有形如database:database=master,model,和language:language=arabic, brazilian, english, 的字符串,其中master、model為服務(wù)器中的數(shù)據(jù)庫(kù)名。利用這些得到信息就可以配置sql server數(shù)據(jù)源了:sqlconfigdatasource(null,odbc_

6、add_dsn,sql server,dsn=mydsn0 server=xhm0database=pubs00 )作者有幸在網(wǎng)上找到santosh rao編寫的csqlinfoenumerator類,該類有 enumeratesqlservers、enumeratedatabase、enumeratedatabaselanguage三個(gè)成員函數(shù),其封裝了sqlbrowseconnect函數(shù)并進(jìn)行相應(yīng)的字符處理,大大簡(jiǎn)化了sqlbrowseconnect函數(shù)的使用。2.與數(shù)據(jù)源建立連接如果使用odbc api函數(shù)進(jìn)行連結(jié),函數(shù)sqlconnect、sqldriverconnect和sqlbro

7、wseconnect都可以實(shí)現(xiàn)。其中sqlconnect函數(shù)用于給定所有參數(shù)直接建立與數(shù)據(jù)源的連接;sqldriverconnect用于給定了部分連接參數(shù),并彈出數(shù)據(jù)源瀏覽窗口與用戶交互,獲得足夠的參數(shù)后建立與數(shù)據(jù)源的連接;而sqlbrowseconnect是通過迭代獲取連結(jié)參數(shù)再進(jìn)行連接,其使用如前所述。mfc為連接數(shù)據(jù)源提供了一個(gè)數(shù)據(jù)庫(kù)類cdatabase,通過它我們可以非常方便地與數(shù)據(jù)源建立連結(jié):/m_db是cdatabase的對(duì)象/m_szuserid,m_szpassword是cstring對(duì)象,為訪問數(shù)據(jù)源的用戶名和密碼 cstring str; str = _t(dsn=xhmt

8、est;uid=)+m_szuserid+_t(;pwd=)+m_szpassword; if (! m_db.openex(str, cdatabase:noodbcdialog ) ) afxmessagebox(打開數(shù)據(jù)源失敗);另外,如果我們想對(duì)數(shù)據(jù)源進(jìn)行操作,就可以利用打開的cdatabase對(duì)象執(zhí)行sql語(yǔ)句實(shí)現(xiàn)。如新建一張表: str = create table tabledemo (column1text, column2 number); m_db.executesql(ssql); 3.得到數(shù)據(jù)庫(kù)的結(jié)構(gòu)信息在vc+中可以單獨(dú)利用odbc api獲取數(shù)據(jù)庫(kù)的結(jié)構(gòu)信息,但方法

9、非常復(fù)雜,各種參數(shù)也不易理解,且返回的結(jié)果不易獲取。mfc中也沒有為應(yīng)用程序開發(fā)者得到數(shù)據(jù)庫(kù)結(jié)構(gòu)信息而提供單獨(dú)的類。但是我們還是可以通過一些已有的方法方便地獲得數(shù)據(jù)庫(kù)的結(jié)構(gòu)信息。3.1 得到數(shù)據(jù)庫(kù)中的表利用odbc api函數(shù)sqltables可以得到數(shù)據(jù)庫(kù)中的表信息,但使用不易。在msdn的sample中有一個(gè)catalog例程,它示范了如果得到一個(gè)數(shù)據(jù)庫(kù)的表信息和表中的字段信息,該程序中有兩個(gè)非常實(shí)用的類:ctables和ccolumns。其中ctables繼承crecordset類,通過非常巧妙的方法封裝了sqltables函數(shù),并將結(jié)果集存于crecordset類,方便獲取。在程序中我

10、們可以這樣應(yīng)用: /m_db是已經(jīng)打開的cdatabse對(duì)象, /m_strtableowner是ccombobox對(duì)象 ctables rs(&m_db); rs.open(null, null, null, table); cstring strtableref; m_combtable.resetcontent(); while (!rs.iseof() strtableref = _t(); if (!rs.m_strtableowner.isempty() strtableref += rs.m_strtableowner + _t(.); strtableref += rs.m_s

11、trtablename + _t(); m_combtable.addstring(strtableref); rs.movenext(); rs.close();在ctables對(duì)象open方法第四個(gè)能數(shù)指定“table”是指返回庫(kù)中的表,當(dāng)該參數(shù)為“system table”時(shí)返回系統(tǒng)表,當(dāng)為null時(shí),返回所有表。3.2 得到表中字段結(jié)構(gòu) 得到表中字段結(jié)構(gòu)有三種具體實(shí)現(xiàn)方式:直接利用odbc api 函數(shù)sqlcolumn;其實(shí)現(xiàn)也同樣復(fù)雜。利用前面提到的封裝了sqlcolumns函數(shù)的ccolumns類;其使用方法與ctables類似,其成員變量m_strcolumnname即為字段名

12、利用crecordset類的成員函數(shù)。mfc在crecordset類中提供了獲取表結(jié)構(gòu)信息方法,使用非常方便。(但很奇怪為什么cdatabase類沒有獲取庫(kù)結(jié)構(gòu)信息的類方法?)我們以利用crecodrset為例簡(jiǎn)單說(shuō)明怎樣得到表結(jié)構(gòu)。假設(shè)現(xiàn)在要得到用戶在ccombobox對(duì)象中所選表的所有字段名,并將它埴入一個(gè)clistctrl對(duì)象(其view屬性被設(shè)為report)的列名中去: /m_strtableowner和上同,為ccombobox對(duì)象 /m_listdata為clistctrl對(duì)象 crecordset rs codbcfieldinfo info;cstring strsql; m_combtable.getlbtext(m_combtable.getcursel(), strsql); strsql = _t(select * from ) + strsql; rs.open(open(crecordset:snapshot, strsql, crecordset:readonly); int ncolumns = rs.getodbcfieldcount(); for (int nnum = 0; nnum getodbcfieldinfo(nnum, info); m_listdata.insertcolumn(nnum, info

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論