數(shù)據(jù)庫接口實(shí)驗(yàn).docx_第1頁
數(shù)據(jù)庫接口實(shí)驗(yàn).docx_第2頁
數(shù)據(jù)庫接口實(shí)驗(yàn).docx_第3頁
數(shù)據(jù)庫接口實(shí)驗(yàn).docx_第4頁
數(shù)據(jù)庫接口實(shí)驗(yàn).docx_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

北京郵電大學(xué)實(shí)驗(yàn)報(bào)告課程名稱 數(shù)據(jù)庫系統(tǒng)原理實(shí)驗(yàn)名稱 數(shù)據(jù)庫接口實(shí)驗(yàn)教師_ 成績_ 2013年 5月 15日實(shí)驗(yàn)?zāi)康?. 通過編寫數(shù)據(jù)庫應(yīng)用程序,培養(yǎng)數(shù)據(jù)庫應(yīng)用程序開發(fā)能力。 2. 熟悉數(shù)據(jù)庫應(yīng)用程序設(shè)計(jì)的多種接口的配置,培養(yǎng)相關(guān)的軟件配置能力。實(shí)驗(yàn)原理數(shù)據(jù)庫應(yīng)用程序設(shè)計(jì)是數(shù)據(jù)庫應(yīng)用的一個重要方面。SQL語言除了以用戶交互的方式使用外,還可以被數(shù)據(jù)庫應(yīng)用程序直接訪問。通常DBMS支持的能直接訪問數(shù)據(jù)庫的是SQL語言,而SQL語言不象高級語言(例如C、C+等)具備很好的數(shù)據(jù)處理能力。通常的情況是需要將兩種語言結(jié)合起來,利用SQL訪問數(shù)據(jù),而將數(shù)據(jù)傳遞給某種高級語言程序,處理后又利用SQL寫回?cái)?shù)據(jù)庫。這種嵌在高級語言程序中的SQL語句稱為嵌入式SQL(或者稱為ESQL),和以前使用的交互式SQL(或者稱為ISQL)不一樣,它們隨著程序執(zhí)行被調(diào)用,輔助程序完成數(shù)據(jù)庫數(shù)據(jù)讀寫的功能,而高級語言程序則負(fù)責(zé)對數(shù)據(jù)庫中的數(shù)據(jù)的分析處理轉(zhuǎn)換等操作。ESQL又分成兩種,如果在程序執(zhí)行前SQL的結(jié)構(gòu)就已經(jīng)確定,最多是可以在執(zhí)行時傳遞一些數(shù)值參數(shù),那么這種ESQL語句稱為靜態(tài)ESQL。如果程序執(zhí)行時才知道執(zhí)行的SQL語句時,稱為動態(tài)ESQL。SQL SERVER中執(zhí)行靜態(tài)ESQL(比如SQLJ)時,首先利用預(yù)編譯將宿主程序語言中的SQL語句分離出來,代之以過程或函數(shù)調(diào)用,然后對剩余程序正常編譯和連接庫函數(shù)等。分離出來的SQL語句則在數(shù)據(jù)庫端進(jìn)行處理,進(jìn)行語法檢查、安全性檢查和優(yōu)化執(zhí)行策略,綁定在數(shù)據(jù)庫上形成包(packet)供應(yīng)用程序調(diào)用。而通過ODBC、JDBC、OLEDB等訪問數(shù)據(jù)庫都是動態(tài)ESQL。SQL SERVER執(zhí)行它們時因?yàn)闊o法事先確實(shí)知道是什么樣的SQL語句,從而無法進(jìn)行靜態(tài)綁定,而這種綁定過程只能在程序執(zhí)行過程中生成了確定的要執(zhí)行的SQL語句時才能進(jìn)行,稱為動態(tài)綁定。應(yīng)用程序的接口則有JDBC、ADO、OLEDB、ODBC等多種。微軟在SQL SERVER 2005開始還增加了幾項(xiàng)功能:一是service broker,圍繞發(fā)送和接收消息而設(shè)計(jì),處理通信中的消息收發(fā)工作,使開發(fā)人員集中精力于解決實(shí)際問題。二是CLR(Common Language Runtime)組件,就是Microsoft.NET Framework中的公共語言運(yùn)行庫組件,使開發(fā)人員可用任何CLR語言來編寫過程、函數(shù)、觸發(fā)器等,甚至自定義數(shù)據(jù)類型。三是對T-SQL做出了許多擴(kuò)展。實(shí)驗(yàn)環(huán)境采用SQL SERVER數(shù)據(jù)庫管理系統(tǒng)作為實(shí)驗(yàn)平臺。其中,SQL SERVER可以采用Express、Develop或者Enterprise版本,選擇SQL SERVER 2005、2008或2012。實(shí)驗(yàn)內(nèi)容1. 了解通用數(shù)據(jù)庫應(yīng)用編程接口(例如JDBC、ODBC等)的配置方法。2. 利用C語言(或其它支持某種數(shù)據(jù)庫應(yīng)用程序接口的高級程序設(shè)計(jì)語言)編程實(shí)現(xiàn)簡單的數(shù)據(jù)庫應(yīng)用程序,掌握基于該接口的數(shù)據(jù)庫訪問的基本原理和方法。3. 掌握靜態(tài)嵌入式SQL語言程序設(shè)計(jì)的原理和方法。4. 在數(shù)據(jù)庫應(yīng)用程序中,執(zhí)行查找、增加、刪除、更新等操作。5. 選擇適當(dāng)?shù)臄?shù)據(jù)訪問接口,比較高的要求為完成靜態(tài)和動態(tài)嵌入式SQL的程序設(shè)計(jì)(需要兩個程序),基本要求為兩者選擇其一。實(shí)驗(yàn)步驟1. 實(shí)驗(yàn)準(zhǔn)備:以教科書第四章關(guān)于SQL語言相關(guān)內(nèi)容為基礎(chǔ),課后查閱、自學(xué)ODBC/JDBC等接口有關(guān)內(nèi)容,包括體系結(jié)構(gòu)、工作原理、數(shù)據(jù)訪問過程、主要API接口的語法和使用方法等。ODBC接口使用步驟1、分配環(huán)境句柄:聲明一個SQLHENV的變量,調(diào)用函數(shù)SQLAllocHandle。設(shè)置環(huán)境屬性:完成環(huán)境分配后,用函數(shù)SQLSetEnvAttr設(shè)置環(huán)境屬性,注冊O(shè)DBC版本號。釋放環(huán)境句柄:完成數(shù)據(jù)訪問任務(wù)時,應(yīng)調(diào)用SQLFreeHandle釋放前面分配的環(huán)境。2、分配連接句柄:聲明一個SQLHDBC類型的變量,調(diào)用SQLAllocHandle函數(shù)分配句柄。設(shè)置連接屬性:所有連接屬性都可通過函數(shù)SQLSetConnectAttr設(shè)置,調(diào)用函數(shù)SQLGetConnectAttr可獲取這些連接屬性的當(dāng)前設(shè)置值。3、 連接數(shù)據(jù)源:對于不同的程序和用戶接口,可以用不同的函數(shù)建立連接SQLConnect:該函數(shù)只要提供數(shù)據(jù)源名稱、用戶ID和口令,就可以進(jìn)行連接了。SQLDriverConnect:該函數(shù)用一個連接字符串建立至數(shù)據(jù)源的連接,它可以讓用戶輸入必要的連接信息,使用系統(tǒng)中還沒定義的數(shù)據(jù)源。SQLBrowseConnect:該函數(shù)支持以一種迭代的方式獲取到數(shù)據(jù)源的連接,直到最后建立連接,它基于客戶機(jī)服務(wù)器體系結(jié)構(gòu),因此本地?cái)?shù)據(jù)庫不支持該函數(shù)。4、 準(zhǔn)備并執(zhí)行SQL語句A、 分配語句句柄:語句句柄是通過調(diào)用SQLAllocHandle函數(shù)分配的。函數(shù)SQLGetStmrrAttr和SQLSetStmrrAttr用來獲取和設(shè)置一個語句句柄的選項(xiàng),使用完,調(diào)用SQLFreeHandle釋放該句柄。B、 執(zhí)行SQL語句SQLExecDirect:該函數(shù)直接執(zhí)行SQL語句,對于只執(zhí)行一次的SQL語句來說,該函數(shù)是執(zhí)行最快的方法。SQLPrepare和SQLExecute:對于需要多次執(zhí)行的SQL語句來說,可先調(diào)用SQLPrepare準(zhǔn)備SQL語句的執(zhí)行,用SQLExecute執(zhí)行準(zhǔn)備好的語句。C、 使用參數(shù):使用參數(shù)可以使一條SQL語句多次執(zhí)行,得到不同的結(jié)果。函數(shù)SQLBindParameter負(fù)責(zé)為參數(shù)定義變量,將一段SQL語句中的一個參數(shù)標(biāo)識符(?)捆綁在一起,實(shí)現(xiàn)參數(shù)值的傳遞。5、 獲取記錄集A、 綁定列:首先必須分配與記錄集中字段相對應(yīng)的變量,然后通過函數(shù)SQLBindCol將記錄字段同程序變量綁定在一起,對于長記錄字段,可以通過調(diào)用函數(shù)SQLGetData直接取回?cái)?shù)據(jù)。綁定字段可以根據(jù)自己的需要全部綁定,也可以綁定其中的某幾個字段。通過調(diào)用函數(shù)SQLBindCol將變量地址值賦為NULL,可以結(jié)束對一個記錄字段的綁定,通過調(diào)用函數(shù)SQLFreeStmt,將其中選項(xiàng)設(shè)為SQL_UNBIND,或者直接釋放句柄,都會結(jié)束所有記錄字段的綁定。B、SQLFetch:該函數(shù)用于將記錄集的下一行變成當(dāng)前行,并把所有捆綁過的數(shù)據(jù)字段的數(shù)據(jù)拷貝到相應(yīng)的緩沖區(qū)。C、 光標(biāo):應(yīng)用程序獲取數(shù)據(jù)是通過光標(biāo)(Cursor)來實(shí)現(xiàn)的,在ODBC中,主要有3種類型的光標(biāo):單向光標(biāo)、可滾動光標(biāo)和塊光標(biāo)。有些應(yīng)用程序不支持可滾動光標(biāo)和塊光標(biāo),ODBC SDK提供了一個光標(biāo)庫(ODBCCR32.DLL),在應(yīng)用程序中可通過設(shè)置連接屬性(SQL_STTR_ODBC_CURSOR)激活光標(biāo)庫。6、 記錄的添加、刪除和更新:數(shù)據(jù)源數(shù)據(jù)更新可通過3種方式:通過SQLExecDirect函數(shù)使用相應(yīng)的SQL語句;調(diào)用SQLSetPos函數(shù)實(shí)現(xiàn)記錄集定義更新;調(diào)用SQLBulkOperations函數(shù)實(shí)現(xiàn)數(shù)據(jù)更新。第一種方式適用于任何ODBC數(shù)據(jù)源,后兩種方式有的數(shù)據(jù)源不支持,可調(diào)用SQLGetInfo確定數(shù)據(jù)源。SQLBulkOperations:該函數(shù)操作基于當(dāng)前行集,調(diào)用前,須先調(diào)用SQLFetch或SQLFetchScroll獲取。函數(shù)調(diào)用后,塊光標(biāo)的位置變?yōu)槲炊x狀況,因此,應(yīng)該先調(diào)用函數(shù)SQLFetchScroll設(shè)定光標(biāo)位置。7、錯誤處理:每個ODBC API函數(shù)都能產(chǎn)生一系列反映操作信息的診斷記錄,可以用SQLGetDiagField函數(shù)獲取診斷記錄中特定的域,另外,可以使用SQLGetDiagRec獲取診斷記錄中一些常用的域。8、事務(wù)處理:事務(wù)提交有兩種方式:自動提交模式和手動提交模式。應(yīng)用程序可通過調(diào)用函數(shù)SQLSetConnectAttr設(shè)定連接屬性SQL_ATTR_AUTOCOMMIT,自動提交模式是默認(rèn)的連接屬性設(shè)置,對于所有的ODBC驅(qū)動程序都能適應(yīng)這種模式下,所有語句都是作為一個獨(dú)立的事務(wù)進(jìn)行處理的。手動提交模式把一組SQL語句放入一個事務(wù)中,程序必須調(diào)用函數(shù)SQLEenTran明確地終止一個事務(wù)。若使用多個激活的事務(wù),就必須建立多個連接,每一個連接包含一個事務(wù)。9、斷開數(shù)據(jù)連接并釋放環(huán)境句柄:完成數(shù)據(jù)庫操作后,可調(diào)用SQLDisconnect函數(shù)關(guān)閉同數(shù)據(jù)庫的連接。 2. 在Windows控制面板中通過管理工具下的ODBC數(shù)據(jù)源工具在客戶端新建連接到SQL SERVER數(shù)據(jù)庫服務(wù)器的ODBC數(shù)據(jù)源,測試連接通過后保存,注意名字要和應(yīng)用程序中引用的數(shù)據(jù)源一樣。另外要注意創(chuàng)建ODBC數(shù)據(jù)源時使用的驅(qū)動程序必須是支持SQL SERVER的,而不可選擇其它驅(qū)動程序。建立一個系統(tǒng)DSN(系統(tǒng)數(shù)據(jù)源)并與SQL數(shù)據(jù)庫相連接使用sa作為登陸與驗(yàn)證的用戶驗(yàn)證成功后,選擇默認(rèn)數(shù)據(jù)庫測試成功3. 以實(shí)驗(yàn)二建立的數(shù)據(jù)庫為基礎(chǔ),編寫 C語言(或其它支持ODBC/JDBC等接口的高級程序設(shè)計(jì)語言) 數(shù)據(jù)庫應(yīng)用程序,利用SQLExecDirect語句,實(shí)現(xiàn)數(shù)據(jù)庫應(yīng)用程序?qū)?shù)據(jù)庫中表(有數(shù)據(jù))進(jìn)行數(shù)據(jù)查詢、刪除、插入、更新等操作。要求先打印出所有記錄,然后刪除一行,再打印一次,進(jìn)行更新,再打印一次,最后插入,再打印一次。注意:SQL SERVER應(yīng)設(shè)置為應(yīng)用程序可以訪問。本次實(shí)驗(yàn)我們使用VC6.0作為實(shí)驗(yàn)環(huán)境實(shí)驗(yàn)結(jié)果數(shù)據(jù)庫中原BSC元組進(jìn)行操作過后實(shí)驗(yàn)總結(jié)在實(shí)驗(yàn)中有哪些重要問題或者事件?你如何處理的?你的收獲是什么?有何建議和意見等等。遇到問題:(1)在進(jìn)行ODBC連接時會出現(xiàn)連接不上的情況,此時要檢查ODBC數(shù)據(jù)源名稱是否對應(yīng)控制面板中新建的ODBC源;還要檢查登陸用戶名和密碼是否正確;再檢查SQL server數(shù)據(jù)庫服務(wù)是否開啟;還要查看系統(tǒng)是否是64位,64位可能出現(xiàn)問題。(2)剛開始我們組編程的時候用的是visual studio 2012進(jìn)行的編程,但是在編譯運(yùn)行的時候總是有問題。后來無意間我們用了visual c+ 6.0 運(yùn)行,最后竟然通過了,而且沒有任何問題。最后可以嘗試使用其他編譯器進(jìn)行編譯,會發(fā)現(xiàn)真的和編譯器有關(guān)系,也許簡單的編譯器鏈接運(yùn)行條件更少一些,不過包括的庫函數(shù)也少,利弊共存。 (3)在配置ODBC源的時候要選擇好默認(rèn)數(shù)據(jù)庫否則可能無法執(zhí)行進(jìn)行正確操作通過這次實(shí)驗(yàn)學(xué)習(xí)到了ODBC作為一個數(shù)據(jù)庫應(yīng)用編程接口也能夠?qū)崿F(xiàn)對數(shù)據(jù)庫的各項(xiàng)操作,在編寫語句的同時,為今后實(shí)現(xiàn)數(shù)據(jù)庫跟程序之間的連接打下了基礎(chǔ)。附錄:源代碼#include#include #include #include sql.h#include sqltypes.h#include sqlext.hRETCODE retcode;/結(jié)果返回集SQLHDBC hdbc;/定義鏈接句柄void print();/打印子程序void SQL(unsigned char);/執(zhí)行SQL語句子程序int main() SQLHANDLE henv; /定義環(huán)境句柄 unsigned char SY=GSM;/ODBC數(shù)據(jù)源名稱 unsigned char db2=sa;/用戶名 unsigned char pass=sa;/密碼 /分配ODBC環(huán)境retcode=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); if(retcode=SQL_SUCCESS|retcode=SQL_SUCCESS_WITH_INFO) /聲明環(huán)境retcode=SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3, 0);if(retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO) retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); /分配連接句柄if(retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO)retcode=SQLConnect(hdbc,SY,SQL_NTS,db2,SQL_NTS,pass,SQL_NTS);/鏈接if(retcode = SQL_SUCCESS | retcode = SQL_SUCCESS_WITH_INFO)printf(打印一次);print();unsigned char del=delete from BSC where BscId=42216;SQL(del); printf(刪除BscId=42216再打印一次);print(); unsigned char update=update BSC set MscID=9999 where BscId=42215;SQL(update);printf(更新BscId=42215再打印一次);print(); unsigned char insert=insert into BSC values(99999,DTBSC,Bell,121.149885,41.120217,9999);SQL(insert);printf(插入新元組BscId=99999再打印一次);print(); SQLFreeConnect(hdbc); /釋放鏈接句柄SQLFreeEnv(henv); / 釋放ODBC 環(huán)境句柄return 0;void print()unsigned char yuju=select * from BSC; SQLHSTMT hstmt;/定義語句句柄 char BscId6,BscName20,BscCompany20,Longitude9,Latitude9,MscID5; long lenOut1,lenOut2,lenOut3,lenOut4,lenOut5,lenOut6;retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); /分配語句句柄if(retcode=SQL_SUCCESS)retcode=SQLExecDirect(hstmt,yuju,SQL_NTS);if(retcode = SQL_SUCCESS|retcode = SQL_SUCCESS_WITH_INFO)/將結(jié)果集中的屬性列一一綁定至變量 retcode=SQLBindCol(hstmt,1,SQL_C_CHAR,BscId,sizeof(BscId),&lenOut1); retcode=SQLBindCol(hstmt,2,SQL_C_CHAR,BscName,sizeof(BscName),&lenOut2); retcode=SQLBindCol(hstmt,3,SQL_C_CHAR,BscCompany,sizeof(BscCompany),&lenOut3); retcode=SQLBindCol(hstmt,4,SQL_C_CHAR,Longitude,sizeof(Longitude),&lenOut4); retcode=SQLBindCol(hstmt,5,SQL

溫馨提示

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

評論

0/150

提交評論