試驗4嵌入式SQL和ODBC的使用_第1頁
試驗4嵌入式SQL和ODBC的使用_第2頁
試驗4嵌入式SQL和ODBC的使用_第3頁
試驗4嵌入式SQL和ODBC的使用_第4頁
試驗4嵌入式SQL和ODBC的使用_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗 4 嵌入式 SQL 和 ODBC 的使用實驗人:田超( 31311039) 黃偉( 31311064)實驗目的1. 熟悉 ODBC 的配置和使用2. 熟悉嵌入式 SQL 編程3. 鞏固 SQL 的知識實驗平臺1. OS : WindowsXP2. DBMS : SQLServer20003. Compiler : Visual C+ 6.0預備知識1)嵌入式 SQL 編程:嵌入式SQL由SQL語句和C/C+代碼組成。其中SQL語句由預處理器翻譯成C或C+的源代碼。對預處理后的源代碼進行編譯、連接生成可執(zhí)行程序后方可運行。SQL 預處理器SQLServer的預處理程序是 nsqlprep.

2、exe。其常用的語法格式如下:nsqlprep 程序文檔名nsqlprep 詳細的語法格式以及參數(shù)意義,請看聯(lián)機幫助。經(jīng)查閱聯(lián)機幫助, nsqlprep 的語法格式如下:nsqlprep program_file_name /SQLACCESS | /NOSQLACCESS /FLAGGER ENTRY | NONE /DB server_name.database_name /PASS login.password | $INTEGRATED /BIND file_name /MSG file_name /NOLOGO /PLAN name /NOLINES /user_defined_op

3、tion要求程序文檔名的后綴為.sqc,可以省略。預編譯后得到的文檔,與程序文檔同名,后綴為.c;放在與程序文檔名同一個路徑下nsqlprep.exe 在 SQLServer 的安裝目錄的 MSSQL'Binn 下。在本機中 SQLServer 的安裝目錄是 C:Program Files'Microsoft SQL Server, nsqlprep.exe 在 C:Program Files'Microsoft SQL ServerMSSQLBinn 。由于默認的安裝方 式(典型安裝)并沒有安裝應用程序 nsqlprep.exe,因此,需要 把本機中院內(nèi)學習工作大三

4、數(shù)據(jù)庫SQLServer2000個人版x86binn目錄下的內(nèi)容拷貝到該目錄下 。連接方式經(jīng)預處理后的c文件就可以用c的編譯器進行編譯連接了。使用 Visual C+ 6.0進行編譯連接,連接方式是動態(tài)連接,用到動態(tài)鏈接庫SQLakw32.dll , sqlaiw32.dll ;此兩文件已經(jīng)隨同 binn.rar的其他內(nèi)容,被拷貝到 C:Program Files'Microsoft SQL ServerMSSQLBinn下;但仍然需要把該路徑加到系統(tǒng)的路徑變量 中,以使得程序運行時能找到這兩個文件。方法1把該兩文件拷貝到操作系統(tǒng)目錄下的子目錄system32中方法 2:把 C:Pro

5、gram Files'Microsoft SQL ServerMSSQLBinn 加到系統(tǒng)環(huán)境變量 path中?!拔业碾娔X”-> “屬性”-> “高級”-> “環(huán)境變量” -> “path,編輯”,如下圖所 示:在變量值中加入該路徑值;注意,路徑間用分號”;”分開。在實驗過程中發(fā)現(xiàn)如果只做第二步,在之后的運行過程中會報錯,只有將方法一也執(zhí)行了 這個連接的準備工作才算是正式完成。2)通過ODBC訪問數(shù)據(jù)庫:配置ODBC,為SQL Server添加數(shù)據(jù)源。如下圖所示:用戶DSN |系妊DSW |文件ISH |驅(qū)動程序|跟蹤|連接池|關(guān)于用戶數(shù)據(jù)懣:名軸dlASE F

6、i“dBsf Fil«s - Word 包1 FileFoxPro Filt - ttcrdHS Access D&t&b&sa馳動程序Nicrosoft dBase Driver (*. dbf) Microsoft Vi sudL F&xPro DriversqlSftrvftrVisusl Fosjo DatabaseVisu«l FoxPro T&HasMicrosoft Excel Driver Nicrosoft ¥isual FoxPro NicrosoftDriverSQL SftrvMi crpsoft V

7、i sual FoxPro MicrciSQft Visu&l F&xFrc&. xls)Driver(*. mdbDriverDriverJ Jj矚嚴鵝躊筒關(guān)讀鵬磁魂用取消應用1幫助初始化環(huán)境:1. SQL Server2000為其嵌入式SQL提供了一些特殊的接口;默認的安裝方式(典型安裝)并沒有安裝這些接口;因此,需要把devtools.rar解壓到SQLServer的系統(tǒng)目錄下(注意,不是安裝目錄);本機是把操作系統(tǒng)安裝在C盤,貝U SQLServer的系統(tǒng)目錄則是 C:Program Files'Microsoft SQL Server。2. 初始化SQ

8、L Server的預編譯環(huán)境。初始化 Visual C+ 6.0 編譯器環(huán)境,運行文件:Microsoft Visual StudioVC98BinVCV ARS32.BAT這個過程要在 DOS下運行才有效,即找vcvars32.bat的路徑,在 DOS下運行。具體步驟如下:hicrosoft Uindous XP版本 5.1.26(1(11<C> 版權(quán)所有 1985-2001 Microsoft Corp.C:Documents and Settingswuwei>cd C: Program FilesMicrosoft Uisual StudioUC98KBinC:xPr

9、ogram Files Mlicrosoft Uisual Studio MJ C98B in>ucuars32.bat Setting enuironment for using Microsoft Uisual C+ tools.C: xProyram FilesMlicrosoft Uisual StudioMJC98Bin>初始化 SQLServer 的預編譯環(huán)境,運行文件:devtoolssamplesesqlcsetenv.bat。運行方式與 vcvars32.bat相同,結(jié)果如下:C: Pi'ogran FilesMlicrosof t Uisual Stud

10、ioUC98Bin>cd C: Pi'ogran FilesMlicrosof t SQL SeruerXSBMools DeuToolssamplesesqlcu.n2ipesqlcC- lbi'O9riii I* i lei; M i<: ro:;ol I. SQI. Se rue r XKWXloo I !; DeuToo I !; !;nip lei;i pIBbatC:Program FilesMicrosoft SQL Seruep80ToolsSDeuToolssamplesesqlcunzip_esql c>3.初始化 Visual C+ 6.

11、0環(huán)境。Tools->optio ns->directories->ln cludeFiles: C:Program FilesMicrosoft SQL Serverdevtoolsi ncludeTools->optio ns->directories->LibFiles:C:Program FilesMicrosoft SQL Serverdevtoolsx86lib注意:這些路徑需要設(shè)為第一項。如下圖所示:Project->Setti ngs->Li nk->Object/Library ModulesSQLakw32.lib ,

12、Caw32.lib注意,兩個文件之間用空格分開。,添加庫文件:X常規(guī) 調(diào)試I C/C+連接|資源I瀏覽信息I衛(wèi)分類:常規(guī)輸岀文件名:Debug/sqlla.exe對象/庫模塊:ib uuid.lib odbc32.lib odbccp32.lib sqlakw32.lib caw32.lib“產(chǎn)生調(diào)試信息兩增扣鏈接允許配置文件忽略全部默認庫 產(chǎn)生MAP文件工程選項回:kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleautJZ.lib uuid.li

13、b odbc32.llib odbccp32.libSi確定以上部分均在上機課上在師姐的指導下完成。實驗活動1.閱讀和分析程序esql.sqc解釋程序的主要內(nèi)容和主要數(shù)據(jù)結(jié)構(gòu)。程序的主要內(nèi)容:嵌入式SQL的使用,將SQL嵌入到C語言中,在SQL的數(shù)據(jù)庫中通過 SELECT 語句獲取數(shù)據(jù),并將獲得的信息通過主變量傳遞給主語言并打印輸出。給出的程序中將程序連接到WXF的SQL服務器上的pubs數(shù)據(jù)庫上,查詢滿足以下SELECT語句的數(shù)據(jù)信息:select EmployeelD from orders where OrderlD = 345查詢得到的結(jié)果由主變量EmployeeID傳給主語言(C語言

14、),C語言得到數(shù)據(jù)信息后打印輸岀。程序分為以下幾塊:1)主變量的聲明:在 EXEC SQL BEGIN DECLARE SECTION;和 EXEC SQL END DECLARE SECTION;之間聲明主變量 EmployeeID。2)連接到DBMS :連接到數(shù)據(jù)庫的管理系統(tǒng)以便從中查詢登陸的數(shù)據(jù)庫。連接到數(shù)據(jù)庫的語法 為:EXEC SQL CONNECT TO SQLServer.DataBaseName USER logName.passwd3)查錯:為了更好的判斷和查找錯誤以修改程序,所以在每次執(zhí)行完SQL語句后都應該對sqlca所返回的狀態(tài)值加以判斷。若sqlcode等于0,則輸出

15、建立成功信息,否則報錯。4) 執(zhí)行查詢:在這里嵌入 SQL 的查詢語句 EXEC SQL select EmployeelD INTO :EmployeelDfrom orders where OrderID = 345 ,并通過主變量 EmployeeID返回查詢到的結(jié)果 打印結(jié)果。5)斷開所有連接:執(zhí)行完所有的數(shù)據(jù)庫的訪問后 ,斷開所有的連接以釋放系統(tǒng)資源。語法為:EXEC SQL DISCONNECT ALL;數(shù)據(jù)結(jié)構(gòu):主要為在數(shù)據(jù)庫中存儲的表,及針對表進行的查找。2.對程序esql.sqc作適當?shù)男薷?,使之可以在本地系統(tǒng)上可以運行。進行預處理、編譯、連接(lib連接),查看運行結(jié)果。1

16、修改:只需要對連接的服務器及數(shù)據(jù)庫進行修改即可:EXEC SQL CONNECT TO SKY.pubs USER abc.abc;同時由于pubs數(shù)據(jù)庫中沒有 orders表,所以對 SELECT語句也作了修改如下:EXECSQLselect emp_id INTO :EmployeeID from employee where lname = 'Accorti'2)進行預處理:將esql.sqc 文件放在MSSQLBinn目錄下,運行 cmd,進入 C:Program FilesMicrosoft SQL ServerMSSQLBinn目錄,用 nsqlprep esql.

17、sqc的方式運行該文件,可以在 C:Program FilesMicrosoft SQLServerMSSQLBinn中找到預編譯后生成的.c文件。運行過程顯示如下:<R><c>Enhedded SQL f ok* C PreConpi Ler«ion S .194-Microsoft Corp 1993-1998- All rights res&rued.I: xPu*ovam FilesMicrosoft SQL SeFUerMSSQLBinn >nsqlpi*ep eftjl.sqc licrasoFt;以 Jitlicrosoft Cop

18、yright<R><C>32-bit C/C+* Optimising Compiler Uersion 12«00.8168 for 80x86 Microsoft Copp 1984-1998_ A11 Fights Fesevued-3)連接操作已經(jīng)在前面的初始化環(huán)境過程中完成。運行結(jié)果如下:不知為什么,在黃 偉的機子上運行時,不管怎么換查詢條件,結(jié)果總是0anple Embedded SQL fop C application onnection to SQL Seruer established mployeeld Result i?: 0 l*es

19、s anv kei/ to continue但是在田超的機子上運行的時候,就能夠得岀正確結(jié)果。田超查詢的是Northwi nd 數(shù)據(jù)庫中的 orders 表,語句為 EXEC SQL select EmployeeID INTO :EmployeeID from orders where OrderID = 10248 ;運行結(jié)果如下:s "G;»yVcc#vcDebugvc.exe"Sample Enbedded SQL for C application Connection to SQL Sejruei* established Emplo5/ee Id B

20、esult is : 5Press an5/ key to cont inue0。于是又開經(jīng)反復實驗,首先排除了黃偉機子的問題,因為在田超的機器上運行也是始懷疑是數(shù)據(jù)庫的問題。首先在程序中打印岀了sqlcode,如圖:"G:myVcclvcDebugvc. ese* Sample Embedded SQL For C application Connect ion to SQL Seiruer- establishetl error:1W039 Emplopee Id Result is: 0 Press anv kejj to continue看到sqlcode<0,說明這個

21、語句沒有被執(zhí)行。開始以為是用戶沒有訪問數(shù)據(jù)庫的權(quán)限的問題,但是發(fā)現(xiàn)把用戶改成sa,把默認數(shù)據(jù)庫改為pubs依然存在這個問題。將田超的sqc文件和黃偉的放在一起比較,最終發(fā)現(xiàn)原來是因為pubs數(shù)據(jù)庫中emp_id的數(shù)據(jù)類型是empid,而在c中定義的主變量是int型,兩者類型不匹配, 造成了錯誤。列:磁ID 名稱數(shù)據(jù)類型大小空軟認倒A1 毎emp_idempid9jfnamevarchar20 黃偉機子上的正確結(jié)果:S120紅盛52535455SBsue1 statusIcitySdnple Embedded SQL for C application Connection to SQL Sev

22、uei* established hrnploee1d Result is: 20Ppcss an v J<ey to cont inue4)岀現(xiàn)的怪異問題:盡管之前的準備步驟都已經(jīng)全部做完,但是在預編譯時總是會岀現(xiàn)以下問題,:FilesMIicrosoFt SQL Seruei*flSSQL'inn>nsqlprep eql«sqc icrosoft (R) Enbedded SQL foi* C Pee-Conpilev. Uersion 8.00.194. Pijrisfht (c) Microsoft Corp 1993-1998* All rilits

23、resumed.Von must set the environnent uartables COMPILER and INCLUDE. COMPILER should be the pathname of j/our C compiler.INCLUDE should be the pathname of the compilerJ s include f iles每次都要重新把安裝文件下的BIN和DEVTOOL重新拷一遍到 C盤SQLSERVER!應得路徑下,然后再在 DOS下運行setenv.bat和vcvars32.bat兩個文件才能解決這個問題,有 時甚至所有步驟都要重新做一次。不明

24、白這是什么原因。我們在網(wǎng)上查到.bat格式的文件是批處理文件, 它在日常的應用中可以發(fā)揮巨大的作用,但批處理命令執(zhí)行的效率比較低,而且不小心會把里面的命令破壞掉。所以不知是不是因為.bat的穩(wěn)定性不好。思考:sqlca結(jié)構(gòu)中主要的數(shù)據(jù)項有哪些?我們常用的有哪些?sqlca是一個含有錯誤變量和狀態(tài)指示符的數(shù)據(jù)結(jié)構(gòu)。通過檢查sqlca,應用程序能夠檢查出嵌入式 SQL語句是否成功,并根據(jù)成功與否決定是否繼續(xù)往下執(zhí)行。 與編譯器自動在嵌入 SQL語句中包含SQLCA數(shù)據(jù)結(jié)構(gòu)。從聯(lián)機幫助上我們可以找到,SQLCA結(jié)構(gòu)中主要的數(shù)據(jù)項如下(用結(jié)構(gòu)體表示)/ 自8 CQtwuniEatiQti Area -

25、 SQLCAtypedef ser-uctSqlcarrunsigned charsqlcBidEYECjLTCH LEN;/ Eyecatcher = 1 SQLCJL丨long sqlcabc;"SQLCA size in bytes = 13 6long aqlcode,;/ SQL return codeshort sqlercml:"Length ±ar SQLmHCunsigned charsq lerrwc SQL ERRMC_S IZ:/ Error message tokensunsigntd 亡har sqlei:tpB;/ Diaghoati

26、e infortn&tlojigng aqjLerrd 6;/ Diagnostic infomatidilunslgnecl char sqlwarn 6;"Earning flagsunsigned cha匚 sqlext3;/ ReseEvedunsigned char sq:lstate(5:/ new metriber)SQLCA;在SQLCA中我們經(jīng)常用到的是 sqlcode,它用來記錄最近執(zhí)行的SQL狀態(tài):"0":表示該SQL語句被正確執(zhí)行,無錯誤發(fā)生>0 :表示執(zhí)行了該語句,但遇到了錯誤<0 :表示由于數(shù)據(jù)庫、系統(tǒng)、網(wǎng)絡(luò)或應用程

27、序錯誤等等原因未執(zhí)行該語句SQL操作的常見的錯誤類型有哪些?如何得到錯誤信息?舉例說明SQL中常見的錯誤類型有:通過下面的這些返回值,可以得到相應的出錯信息。例子是我們上面黃偉機子上出現(xiàn)的問題,當時sqlcode返回值為-10039,我覺得它代表的應該是類型不匹配的錯誤,但不知道為什么,在下面這張表(聯(lián)機叢書)里查不到這個值Message numberRun time/ compile timeDescription-4998CAttempt to connect to the specified database server failed.-19031cUn able to ope n b

28、in dfile.-19051匚CToo many sections.-19101RStateme nt too long.-19103RIllegal %s value %s.Nonnumeric %s value %s.(In valid nu mber for the time-out value.)-19104R/CIn correct SQL stateme nt syn tax.-19199CESQL keyword(s) detected in PREPARE stateme nt.-19306CHost variable used but not declared.-19313

29、RToo few host variables.-19324CHost variable may not be used in this con text.-19408RIn valid SQL data type for SQL_TYP_DECIMAL.-19413RData overflow occurred duri ng decimal data conversion.-19422RUnknown SQL Server data type.-19423RIn valid dest in ati on data type.-19501RNo cursor declared.-19505C

30、Duplicate cursor n ame: %s.-19508RCursor not positi oned on a row.-19514RCursor not prepared.-19517RCursor open attempted for non-SELECT prepared stateme nt.-19521ROpen cursor failure for sect ion %d of pla ns.-19523RFailure to locate/close cursor. Section %d, plan %s.-19524RTable for this cursor no

31、t updatable.-19525RAttempt to fetch on un ope ned cursor.-19526RNo access pla n for this cursor.-19527RCould not get sect ion for this cursor.-19528RConnection for section %d of plan %s has NULLDBPROCESS .-19701RNULL connection n ame.Connection %s not found.-19702RConnection n ame not found.Attempt

32、to close non existe nt conn ecti on.-19703RFailed to get DBPROCESS .Autoc onn ect failure.-19706RLogin failure in section %d.-19707RDuplicate connection n ame.-19822RImproperly in itialized user SQLDA.-19911CThe SQL data type specified for a host variable is in valid.-19913CThe token identifier has

33、already been used.-19917CIn valid or in correct opti on to sqlainit().-19946CCursor %s not declared.-19953CIn valid call type.-19955RText not found in %s sect ion %u.-19956RAccess pla n sect ion or stateme nt text not found.-19957RAccess pla n or stateme nt text not found.-19994RCannot run next BEGI

34、N DECLARE sections.Stateme nt igno red.-19995REND DECLARE encoun tered without precedi ng BEGIN DECLARE stateme nt. Stateme nt ig nored.-19999CAn internal error occurred.連接DBMS錯誤通過sqlca中的變量sqlcode的返回值獲得錯誤信息,當返回值為0時,表示連接成功,否則,連接失敗。例如esql.sqc中用以下語句獲得錯誤信息:if (SQLCODE = 0)prin tf("Co nn ection to S

35、QL Server established'n");elseII連接DBMS錯誤prin tf("ERROR: Conn ection to SQL Server failedn");return (1);如何處理SQL操作的錯誤信息?a) 對于DBMS連接錯誤:檢查連接是否正常:1 )看SQL服務器是否啟動2) 所連接的數(shù)據(jù)庫是否存在3) 登錄用戶是否具備相應的權(quán)限(登錄用戶的數(shù)據(jù)庫角色)4) 網(wǎng)絡(luò)連接端口 (1433)是否打開b) 用 sqlcode:在程序的error段輸入如下語句:error:printf("錯誤 %dn",SQ

36、LCODE);根據(jù)sqlcode的值查看聯(lián)機幫助,根據(jù)在聯(lián)機幫助上查到的錯誤信息檢查相應的SQL語句,針對性的進行修改,直到其能正確運行c) WHENEVER 語句:在每條嵌入式SQL語句之后立即編寫一條檢查SQLCODE值的程序是一件很繁瑣的事情,為了簡化錯誤處理,可以使用WHENEVER語句:WHENEVER 是說明語句,不是可執(zhí)行語句,不返回SQLCODE,只是根據(jù)SQLCA中的返回碼指定相應的措施。它通知預編譯程序在每條可執(zhí)行嵌入式SQL語句之后自動生成錯誤處理程序,并指定了錯誤處理操作。用戶可以使用WHENEVER語句通知預編譯程序去如何處理三種異常處理:IWHENEVER SQLE

37、RROR action :表示一旦sql語句執(zhí)行時遇到錯誤信息,則執(zhí)行 action, action中包含了處理錯誤的代碼( SQLCODE<0 )。lWHENEVER SQLWARNING action :表示一旦sql語句執(zhí)行時遇到警告信息,則執(zhí)行aciton,即action中包含了處理警報的代碼( SQLCODE=1 )。lWHENEVER NOT FOUND :表示一旦sql語句執(zhí)行時沒有找到相應的元組,則執(zhí) 行action,即action包含了處理沒有查到內(nèi)容的代碼( SQLCODE=100 )。針對上述三種異常處理,用戶可以指定預編譯程序采取以下三種行為(action):lW

38、HENEVER GOTO :通知預編譯程序產(chǎn)生一條轉(zhuǎn)移語句。lWHENEVERCONTINUE :取消先前的 WHENEVER 語句的作用,通知預編譯程 序讓程序的控制流轉(zhuǎn)入到下一個主語言語句。lWHENEVERCALL :通知預編譯程序調(diào)用函數(shù) 。例如:EXEC SQL WHENEVER SQLERROR GOTO er1EXEC SQ L INSERT INTO student V ALUES ( ' si 'EXEC SQL INSERT INTO student V ALUES ( '2',.)經(jīng)過預編譯后會轉(zhuǎn)換為以下語句:EXEC SQL INSERT

39、 INTO student V ALUES ( ' si ',.)If (sqlca.sqlcode < 0) goto erl ;EXEC SQL INSERT INTO student V ALUES ( ' s2 ',.)If (sqlca.sqlcode < 0) goto erl ;出錯處理函數(shù)如下:void hSQLError(char *msg)printf("n%s,%ld,%sn", msg,sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc);EXEC SQL ROLLBA

40、CK RELEASE;exit(-1);如何斷開連接,并釋放資源清除環(huán)境?建議嘗試程序esql.sqc的方法以外的別的方法。釋放資源清除環(huán)境:EXEC SQL COMMIT WORK RELEASE;斷開連接:EXEC SQL DISCONNECT ALL;/ 斷開所有連接EXEC SQLDISCONNECT connection_name ; 如果在連接時定義了連接名,則可通 過斷開連接名來斷開連接(如定義了 EXEC SQL CONNECT TO SKY .pubs AS Myconnection USER sa.sa ;就 可以通過EXEC SQLDISCONNECT Myconnect

41、ion斷開和數(shù)據(jù)庫pubs的連接,此 語句對和其他數(shù)據(jù)庫的連接無效)EXEC SQL DISCONNECT CURRENT ; 表示斷開當前連接3.閱讀和分析程序odbc.cpp,解釋程序的主要內(nèi)容和主要數(shù)據(jù)結(jié)構(gòu)。程序的主要內(nèi)容:在連接到的數(shù)據(jù)源上查詢sno='s1'的sname和city.程序主要分為以下幾塊:以下為程序開始部分:1) 定義retcode, henv, hdbc, hstmt四個變量,分別對應錯誤返回碼,環(huán)境句柄,數(shù)據(jù)庫連接句柄,語句句柄;2) 用SQLAllocHandle 分配環(huán)境變量, 同時用SQLSetEnvAttr告訴odbc這是一個 odbc3.0

42、的應用程序;3) 用SQLAllocHandle分配連接句柄;4) 用SQLConnect連接數(shù)據(jù)庫;以下為程序主體部分:5) 使用SQLAllocHandle分配語句句柄;6) 用SQLExecDirect或別的語句執(zhí)行表的創(chuàng)建,查詢,及修改;7) 用SQLBindCol把某個結(jié)果屬性列綁定到變量上,用SQLFetch獲取查詢信息;或是用SQLFetch和SQLGetData來獲取查詢信息。以下為程序結(jié)束部分,釋放所有句柄和環(huán)境空間:8) 用SQLFreeHandle釋放語句句柄;9)用 SQLDisconnect 斷開連接;10)用SQLFreeHandle釋放連接句柄11)用SQLFre

43、eHandle釋放環(huán)境句柄心得:在程序中申請三個句柄的過程是環(huán)環(huán)相扣的, 系統(tǒng)在分配句柄的過程中要用到以前 句柄的參數(shù)。而在釋放句柄的時候,是要按照申請句柄的逆序來逐一釋放的。程序的主要數(shù)據(jù)結(jié)構(gòu):我認為是三個句柄以及在處理結(jié)果的時候SQLBindCol (或SQLGetData )函數(shù)所開辟的緩沖區(qū)。4. 對程序odbc.cpp作適當?shù)男薷模怪梢栽诒镜叵到y(tǒng)上可以運行。進行編譯、連 接,查看運行結(jié)果。首先配置ODBC,為SQL Server添加數(shù)據(jù)源,如下圖:添加了 sqlhw數(shù)據(jù)源,其配置如下:此向?qū)椭?令審覘于連接SOL雕r的ODBC數(shù)據(jù)源口您想用什么名稱來命名數(shù)據(jù)源?名稱 Q1

44、) : Isqlhw擁希望如何當述此數(shù)據(jù)源?當謹:|您想連搔哪個SQL Servftr?服務器:fSKY完成 |下一步Qi) :>| _ 取消幫包麗使用ANSI引用的標識哥更改默認數(shù)據(jù)庫為exp317使用AHSI的空值、埴充及警告醫(yī)hr若主SQL Server不可用諳使用故陣轉(zhuǎn)移SQL Server .上一歩丁一步通|駆消 | 幫助之后要在程序中對數(shù)據(jù)源以及登錄ID和密碼做修改,修改如下:char* szDSN = "sqlhw"char* szUID = "abc"/log n amechar* szAuthStr = "abc&quo

45、t;/passward并對SELECT語句做相應的修改,修改為如下查詢語句:SEIECT sn ame,city FROM provider where sn o='s1'查詢結(jié)果如下:nain£ =Press any keij to continue思考:snamestates紅盛益瞿方泰民天梏勝菇豐為邇30203025<KULL>a)如何判斷調(diào)用 ODBC函數(shù)是否正確?常見的錯誤類型有哪些?如何得到錯誤 信息?舉例說明在驅(qū)動程序執(zhí)行 ODBC函數(shù)的時候會根據(jù)其執(zhí)行情況返回不同的代碼,數(shù)據(jù) 類型為ERTCODE。函數(shù)的返回碼有一下幾種取值:SQL_SUC

46、CESS返回值為0,執(zhí)行成功,無錯誤信息。SQL_SUCCESS_WITH_INFO 返回值大于 0,函數(shù)執(zhí)行成功,但可能 產(chǎn)生了非致命的錯誤。SQL_ERROR返回值小于0,函數(shù)執(zhí)行失敗。 此外還有一些在我們這次實驗用不多的返回值??梢允褂脙蓚€ ODBC函數(shù)調(diào)用來檢索 ODBC信息:SQLGetDiagRec 和 SQLGetDiagField。若要獲得 SQLState、pfNative和 ErrorMessage診斷字段中與 ODBC 有關(guān)的 主要信息,則調(diào)用 SQLGetDiagRec,直到它返回 SQL_NO_DA TA為止??蓪γ?個診斷記錄調(diào)用SQLGetDiagField以檢索

47、個別字段。所有驅(qū)動程序?qū)S米侄味急仨氂?SQLGetDiagField 檢索。SQLGetDiagRec和SQLGetDiagField由ODBC 驅(qū)動程序管理器而不是個別 的驅(qū)動程序來處理。ODBC驅(qū)動程序管理器在連接成功建立之前,不高速緩存驅(qū) 動程序?qū)S迷\斷字段。在連接成功建立之前無法對驅(qū)動程序?qū)S迷\斷字段調(diào)用 SQLGetDiagField。 這還包括 ODBC 連接命令,即便它們返回 SQL_SUCCESS_WITH_INFO。驅(qū)動程序?qū)S迷\斷字段在下一個ODBC函數(shù)調(diào)用之前不可用。b)如何判斷緩沖區(qū)中的數(shù)據(jù)已經(jīng)讀取完畢?通過返回 SQL_NO_DATA來判斷。SQLFetch發(fā)出結(jié)果

48、集結(jié)束的信號時,調(diào)用SQLMoreResults確定是否還有其它結(jié)果集可用。如果返回SQL_SUCCESS,表明有另一個結(jié)果集可用。如果返回SQL_NO_DATA,表明沒有其它結(jié)果集可用。女口 果返回 SQL_SUCCESS_WITH_INFO 或 SQL_ERROR,則調(diào)用 SQLGetDiagRec確定 PRINT 或RAISERROR 語句的輸出是否可用。c)讀取數(shù)據(jù),有兩種方法:SQLBindCol和SQLGetData,他們有什么不一樣?SQLBindCol和SQLGetData的函數(shù)參數(shù)順序完全一樣,它們的作用也基本相 同,不同之處在于: SQLBindCol以列為單位為結(jié)果集分配

49、空間。一次可以處理多行。而SQLGetData 一次只能從當前行中讀取一列數(shù)據(jù),他需要SQLFetch為其定位游標。 SQLGetData可以讀取較長的數(shù)據(jù),因為在函數(shù)的參數(shù)中columnLen為結(jié)果而SQLBindCol的這個參數(shù)為讀中未讀取數(shù)據(jù)的長度,不是該列全部數(shù)據(jù)的長度, 取列的全部數(shù)據(jù)長度。d)如何判斷結(jié)果為空值?在調(diào)用SQLBindCol函數(shù)的時候有參數(shù) columnLen返回讀取列的實際長度,當columnLen的值小于0的時候表示該列為空值。本實驗中的null值就是通過它 來判斷和輸出的。e)可否重新讀取該緩沖區(qū)的數(shù)據(jù)?(假設(shè)已經(jīng)通過SQLFetch讀了一遍)。如果可以,怎么操

50、作?如果不可以,為什么?我們認為是可以實現(xiàn)的,因為游標的實現(xiàn)上應該就是一個緩沖區(qū)和一個指針,再c中對文件的操作里有把指針移動到文件開始位置的函數(shù),但是在odbc中我們沒有查到類似的函數(shù)。所以沒能實現(xiàn)。編寫程序,分別使用嵌入式SQL和ODBC調(diào)用實現(xiàn)如下的功能:1. 編寫程序,創(chuàng)建下列關(guān)系表,并插入數(shù)據(jù)。create table provider (SNO char(5) primary key,SNAME char(10) not null,STATUS int,CITY char(10);insert into provider values('S1','精益'

51、;,'20','天津');insert into provider values('S2','勝錫','10','北京');insert into provider values('S3','東方紅','30','天津');insert into provider values('S4','豐泰盛','20','天津');insert into provider value

52、s('S5','為民','30','上海');insert into provider values('S6','通天','25',null);2. 實現(xiàn)從employee表中讀取sname和city屬性的數(shù)據(jù),并在屏幕上顯示出來。說明:以上兩個步驟在兩種方法中都是在同一個程序中實現(xiàn),關(guān)鍵部分用黃色標出,exp為在企業(yè)管理器中新建的數(shù)據(jù)庫。源程序如下:A)用嵌入式SQL實現(xiàn):#i nclude <stdio.h>#i nclude <stdlib.h>EXEC

53、 SQL INCLUDE sqlca;int mai n()EXEC SQL BEGIN DECLARE SECTION;/主變量char sno 5;char sn ame10;int status;char city10;short city Ind;/ 指示變量EXEC SQL END DECLARE SECTION;pr in tf("This is my Embedded SQL for C applicati onn");EXEC SQL CONNECT TO SKY.exp USER sa.sa; / 連接到數(shù)據(jù)庫if (SQLCODE = 0)prin tf

54、("Co nn ection to SQL Server establishedn");else/ 連接DBMS昔誤printf("ERROR: Connection to SQL Server failed'n");return (1);/下面為程序的主體部分EXEC SQL create table provider (sno char(5)primary key,sn amechar(10)notn ull,status int,citychar(10);EXEC SQL insert into provider values('S

55、1','精益','20','天津');EXEC SQL insert into provider values('S2','勝錫','10','北京');EXEC SQL in sert into provider values('S3','東方紅','30','天津');EXEC SQL in sert into provider values('S4','豐泰盛','2

56、0','天津');EXEC SQL in sert into provider values('S5','為民','30','上海');EXEC SQL in sert into provider values('S6','通天','25',null);EXEC SQL WHENEVER SQLERROR GOTO error;錯誤處理EXEC SQL WHENEVER NOT FOUND GOTO done;EXEC SQL DECLARE provider

57、Cursor CURSOR FORSELECTsn ame, cityFROMprovider;EXEC SQL OPEN providerCursor ;for ( ; ; ) /* Fetch n ext row of the result table */EXEC SQL FETCH providerCursor INTO :sn ame,:city:cityl nd;/* display data */printf ("S name:%s ",s name);if ( citylnd< 0)/通過設(shè)置指示變量,并判斷指示變量的值<0來確認和輸岀null值printf ("City:NULLn");elseprintf (&q

溫馨提示

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

評論

0/150

提交評論