實驗七-通過ODBC訪問數(shù)據(jù)庫_第1頁
實驗七-通過ODBC訪問數(shù)據(jù)庫_第2頁
實驗七-通過ODBC訪問數(shù)據(jù)庫_第3頁
實驗七-通過ODBC訪問數(shù)據(jù)庫_第4頁
實驗七-通過ODBC訪問數(shù)據(jù)庫_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

實驗?zāi)康模豪斫釵DBC的相關(guān)概念:ODBC、句柄等;理解ODBC的工作原理;掌握ODBC的工作流程;掌握通過ODBC訪問數(shù)據(jù)庫的方法二、實驗環(huán)境:SQLServer、VC三、實驗學(xué)時:二學(xué)時四、實驗內(nèi)容和步驟:〔一〕配置數(shù)據(jù)源配置數(shù)據(jù)源共有兩種方法:方法一:運(yùn)用數(shù)據(jù)源管理工具來進(jìn)行配置。方法二:使用DriverManager提供的ConfigDsn函數(shù)來增加、修改或刪除數(shù)據(jù)源。這種方法特別適用于在應(yīng)用程序中創(chuàng)立的臨時使用的數(shù)據(jù)源。在本實驗中,我們采用第一種方法創(chuàng)立數(shù)據(jù)源。我們將其取名為SQLServer。下面是建立這數(shù)據(jù)源的具體步驟。選擇『開始』│『設(shè)置』│『控制面板』菜單,在彈出窗口中雙擊“管理工具〞圖標(biāo)進(jìn)入管理工具界面,雙擊“數(shù)據(jù)源〔ODBC〕〞圖標(biāo)。建立SQLServer數(shù)據(jù)源。選擇“系統(tǒng)DSN〞選項,單擊【添加(D)…】按鈕,系統(tǒng)彈出“創(chuàng)立新數(shù)據(jù)源〞對話框,如下列圖所示:圖1數(shù)據(jù)源管理器如圖2所示,在ODBC驅(qū)動器程序列表中,選擇“SQLServer〞,單擊【完成】按鈕,系統(tǒng)彈出“CreateNewDataSourcetoSQLServer〞對話框,如圖圖2創(chuàng)立數(shù)據(jù)源配置如圖3,輸入數(shù)據(jù)源名稱和效勞器,單擊【下一步】按鈕。圖中數(shù)據(jù)源的名稱為SQLServer,效勞器為(local)。如圖4,選擇身份認(rèn)證方式,輸入用戶名和密碼,用戶名和口令分別為sa和sa〔請根據(jù)實際情況進(jìn)行修改,并對源代碼進(jìn)行相應(yīng)的修圖3SQLServer數(shù)據(jù)源配置〔1〕圖4SQLServer數(shù)據(jù)源配置〔2〕連續(xù)單擊【下一步】按鈕,這樣就創(chuàng)立了一個名為“SQLServer〞的SQLServerODBC數(shù)據(jù)源。如圖5所示,將彈出一個提示框,提示即將創(chuàng)立一個新的ODBC數(shù)據(jù)源。圖5提示框如果要測試和數(shù)據(jù)源的連接是否成功,可以單擊“TestDataSource〞,如果連接成功,系統(tǒng)將會顯示一個連接成功的消息框,如圖6所示。圖6連接成功以上五步就建立了一個名為SQLServer的數(shù)據(jù)源。注:在創(chuàng)立數(shù)據(jù)源,測試連接是否成功時,如果KingbaseES和SQLServer未啟動效勞,那么將顯示連接失敗。啟動效勞后,再進(jìn)行測試,連接成功。〔二〕通過ODBC訪問數(shù)據(jù)庫,并且對數(shù)據(jù)庫進(jìn)行操作。1.實驗環(huán)境介紹。在本實驗中,我們將編寫程序連接到RDBMS的數(shù)據(jù)源,將數(shù)據(jù)錄入到SQLServer數(shù)據(jù)庫的STUDENT中。2.在VC++6.0環(huán)境中編程實現(xiàn)訪問數(shù)據(jù)庫。實驗預(yù)備。本實驗源程序名為odbc,代碼在《數(shù)據(jù)庫系統(tǒng)概論》書中已經(jīng)給出。下面我們將在VC++6.0環(huán)境下對該程序進(jìn)行編譯。實驗步驟。首先,在VC++6.0中新建一個Win32ConsoleApplication的工程,并將工程命名為ODBC03。然后,將已經(jīng)寫好的ODBC.c文件參加到該工程的SourceFiles中,編譯并且執(zhí)行。實驗源代碼。以下為本實驗實際程序的源碼,并給出了一些注釋,供參考。#include<stdio.h>#include<iostream.h>#include<string.h>#include<windows.h>#include<sql.h>#include<sqlext.h>#include<odbcss.h>#defineMAXBUFLEN255 #defineMaxNameLen20//下面這句是預(yù)處理語句,使程序在編譯時分別編譯綁定段或SQLGetdata段#defineSQLBINDCOLSQLHENVhenv=SQL_NULL_HENV;//定義環(huán)境句柄SQLHDBChdbc1=SQL_NULL_HDBC;//定義數(shù)據(jù)庫連接句柄SQLHSTMThstmt1=SQL_NULL_HSTMT;//定義語句句柄intmain(){ RETCODEretcode;//錯誤返回碼//AllocatetheODBCEnvironmentandsavehandle. retcode=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv); if(retcode<0)//錯誤處理 { cout<<"allocateODBCEnvironmenthandleerrors."<<endl; return-1; } //NotifyODBCthatthisisanODBC3.0application. retcode=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER); if(retcode<0)//錯誤處理 { cout<<"theODBCisnotversion3.0"<<endl; return-1; } //AllocateanODBCconnectionandconnect. retcode=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc1); if(retcode<0)//錯誤處理 { cout<<"allocateODBCconnectionhandleerrors."<<endl; return-1; } //DataSourceNamemustbeoftypeUserDNSorSystemDNS char*szDSN="sql_37"; char*szUID="sa";//logname char*szAuthStr="1234321";//passward //connecttotheDataSource retcode=SQLConnect(hdbc1,(SQLCHAR*)szDSN,(SWORD)strlen(szDSN),(SQLCHAR*)szUID,(SWORD)strlen(szUID),(SQLCHAR*)szAuthStr,(SWORD)strlen(szAuthStr)); if(retcode<0)//錯誤處理 { cout<<"connecttoODBCdatasourceerrors."<<endl; return-1; } //Allocateastatementhandle. retcode=SQLAllocHandle(SQL_HANDLE_STMT,hdbc1,&hstmt1); if(retcode<0)//錯誤處理 { cout<<"allocateODBCstatementhandleerrors."<<endl; return-1; } //ExecuteanSQLstatementdirectlyonthestatementhandle.每一句后面都跟了一個錯誤處理,當(dāng)發(fā)生錯誤時可以很方便的判斷錯在哪里 retcode=SQLExecDirect(hstmt1,(SQLCHAR*)"createtables(snochar(5)primarykey,snamechar(10)notnull,ssexchar(2),sageint,sdeptchar(10))",SQL_NTS); if(retcode<0) { cout<<"createrrors."<<endl; return-1; } retcode=SQLExecDirect(hstmt1,(SQLCHAR*)"insertintosvalues('95001','郝紅','女',20,'計科')",SQL_NTS); if(retcode<0) { cout<<"s1inserterrors."<<endl; return-1; } retcode=SQLExecDirect(hstmt1,(SQLCHAR*)"insertintosvalues('95002','秦沛','男',21,'計科')",SQL_NTS); if(retcode<0) { cout<<"s2inserterrors."<<endl; return-1; } retcode=SQLExecDirect(hstmt1,(SQLCHAR*)"insertintosvalues('95003','劉蓉','女',22,'網(wǎng)絡(luò)')",SQL_NTS); if(retcode<0) { cout<<"s3inserterrors."<<endl; return-1; } retcode=SQLExecDirect(hstmt1,(SQLCHAR*)"insertintosvalues('95004','張超','男',20,'網(wǎng)絡(luò)')",SQL_NTS); if(retcode<0) { cout<<"s4inserterrors."<<endl; return-1; } retcode=SQLExecDirect(hstmt1,(SQLCHAR*)"insertintosvalues('95005','王珂','男',20,'軟件')",SQL_NTS); if(retcode<0) { cout<<"s5inserterrors."<<endl; return-1; } retcode=SQLExecDirect(hstmt1,(SQLCHAR*)"insertintosvalues('95006','方案','男',21,'軟件')",SQL_NTS); if(retcode<0) { cout<<"s6inserterrors."<<endl; return-1; } retcode=SQLExecDirect(hstmt1,(SQLCHAR*)"SElECTsname,sdeptFROMs",SQL_NTS); if(retcode<0) { cout<<"ExecutingstatementthroughtODBCerrors."<<endl; return-1; } //SQLBindColvariables SQLCHARsdept[MaxNameLen+1]; SQLCHAR sname[MaxNameLen+1]; SQLINTEGERcolumnLen=0;//數(shù)據(jù)庫定義中該屬性列的長度#ifdefSQLBINDCOL//游標(biāo)已被封裝在其中,一開始把兩個列號分別寫為s中的列號2〔sname〕,5〔sdept〕,第二個參數(shù)應(yīng)為游標(biāo)中的列號,而不是表中的列號, retcode=SQLBindCol(hstmt1,1,SQL_C_CHAR,sname,MaxNameLen,&columnLen); retcode=SQLBindCol(hstmt1,2,SQL_C_CHAR,sdept,MaxNameLen,&columnLen); while((retcode=SQLFetch(hstmt1))!=SQL_NO_DATA) { if(columnLen>0) printf("sname=%ssdept=%s\n",sname,sdept); else printf("sname=%ssdept=NULL\n",sname,sdept); }#else while(1) { retcode=SQLFetch(hstmt1); if(retcode==SQL_NO_DATA) break; retcode=SQLGetData(hstmt1,1,SQL_C_CHAR,sname,MaxNameLen,&columnLen); retcode=SQLGetData(hstmt1,2,SQL_C_CHAR,sdept,MaxNameLen,&columnLen); if(columnLen>0) printf("sname=%ssdept=%s\n",sname,sdept); else printf("sname=%ssdept=NULL\n",sna

溫馨提示

  • 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

提交評論