高賢君 楊元維
摘要:針對C#程序設(shè)計數(shù)據(jù)庫編程教學中存在的數(shù)據(jù)源種類多、不理解參數(shù)化和存儲過程的意義和使用等問題,重新梳理知識點,提出將實踐任務(wù)融入教學,具體融合知識點并映射為實踐任務(wù)、實現(xiàn)理論與實踐一體化教學,該教學方式有助于培養(yǎng)學生編程思維和實踐能力。
關(guān)鍵詞:C#;數(shù)據(jù)庫編程;soL;存儲過程;DataAdapter
中圖分類號:G642 文獻標識碼:A
文章編號:1009-3044(2020)08-0165-03
《C#程序設(shè)計》課程是筆者所在專業(yè)——GIS專業(yè)一門專業(yè)必修課,一般開設(shè)在大學本科期間第三學期,共計72(理論52+實踐20)學時。本課程先修課程包括《計算機基礎(chǔ)》《數(shù)據(jù)結(jié)構(gòu)》與《C程序設(shè)計》等計算機類課程[1-2],由于GIS專業(yè)并未像計算機專業(yè)一樣單獨開設(shè)《面向?qū)ο蟪绦蛟O(shè)計》與《程序設(shè)計方法學》等課程,在教學時需涵蓋這兩門課程的基本內(nèi)容[3]。數(shù)據(jù)庫編程部分屬于本課程第十二章內(nèi)容,筆者選用的李正夫等編著的《C#程序設(shè)計實用教程》教材中章節(jié)名稱為《ADO.NET》,ADO(ActiveX Data Objects.ActiveX數(shù)據(jù)對象)屬于.NET平臺的數(shù)據(jù)庫編程組件庫,調(diào)用該組件可實現(xiàn)對各主流數(shù)據(jù)庫的連接、數(shù)據(jù)查詢、讀寫、刪除等操作。
數(shù)據(jù)庫編程技術(shù)是一項非常重要的程序設(shè)計技術(shù),它幾乎應(yīng)用于所有的應(yīng)用系統(tǒng)之中[5-6],因此是一項必須重點掌握的技能。然而,由于不同數(shù)據(jù)庫服務(wù)提供商之間連接、讀取數(shù)據(jù)各有差異,需要適當?shù)臄?shù)據(jù)庫驅(qū)動程序支持,讀取數(shù)據(jù)的過程也略有差異。因此,該部分內(nèi)容雖然知識點不多但內(nèi)容有深度,且涉及的類、接口比較多,造成學生難以掌握數(shù)據(jù)庫編程技術(shù)[7-8]。
1 目前數(shù)據(jù)庫編程教學中存在的問題
f1)數(shù)據(jù)源種類多,不同數(shù)據(jù)源連接和讀取有一定的差異
ADO.NET中提供OLE DB、ODBC、SQL Server和Oracle四種數(shù)據(jù)程序,而四種類型又分別包含四個常用類對象類型,分別是Connection、Command、DataReader、DataAdapter對象,其中各對象之間又包含多種屬性和方法。在理解這部分的內(nèi)容時,學生經(jīng)常會不知道應(yīng)該使用哪種類型的數(shù)據(jù)程序,也弄不清如何使用這些常用對象和其方法。
(2)參數(shù)化的作用和意義理解不深入
Command對象執(zhí)行的結(jié)構(gòu)化查詢語言(Structured QueryLanguage。SQL),可以視為將soL語句傳遞給數(shù)據(jù)庫系統(tǒng)中,然后該系統(tǒng)執(zhí)行后將結(jié)果返回給客戶端,而在此過程中,為了防止數(shù)據(jù)庫注入,常對soL語句采用參數(shù)化方式,提升安全性。然而在實際教學中,筆者發(fā)現(xiàn),學生對該部分內(nèi)容的作用和意義的理解不深人,并且存在“學過但不會用”的情況。
(3)存儲過程不理解,更不知道該如何使用
存儲過程(Stored Procedure)是在大型數(shù)據(jù)庫系統(tǒng)中,一組為了完成特定功能的soL語句集,它存儲在數(shù)據(jù)庫中,一次編譯后永久有效,用戶通過指定存儲過程的名字并給出參數(shù)來執(zhí)行它。存儲過程是數(shù)據(jù)庫中的一個重要對象。然而,對于使用存儲過程的意義和執(zhí)行效率不甚了解,在其看來,使用soL語句能夠?qū)崿F(xiàn)同樣的效果,為什么需要用存儲過程?如何調(diào)用存儲過程完成特定的操作。
2 重新梳理知識點,突出實踐教學
針對以上問題,需對數(shù)據(jù)庫編程技術(shù)教學知識點進行重新梳理,突出實踐能力的培養(yǎng),改進以往填鴨式教學模式,確立教學主線,引導(dǎo)學生積極完成實踐任務(wù),通過實踐加深對數(shù)據(jù)庫編程知識點的理解,提升學以致用,以用促學。
通過梳理知識點,構(gòu)建C#中數(shù)據(jù)庫編程中主要常用Con-nection、Command、DataReader、DataAdapter對象之間的邏輯圖,如圖l所示,從數(shù)據(jù)庫到應(yīng)用程序,需要先連接數(shù)據(jù)庫,然后裝配好Command對象并進行執(zhí)行,將獲取數(shù)據(jù)以適當?shù)姆绞竭M行存放,并將數(shù)據(jù)提供給應(yīng)用程序。
在該部分內(nèi)容解決時,預(yù)先設(shè)定好實踐任務(wù),如圖2所示,給定一個圖書信息數(shù)據(jù)庫,要求學生實現(xiàn)數(shù)據(jù)庫讀寫各功能模塊,學生需對提出的問題進行分析,并根據(jù)數(shù)據(jù)庫編程知識點解決問題。此過程需要甄別核心知識點,應(yīng)當考慮學生實際編程能力和興趣,設(shè)置合適的實踐目標與內(nèi)容,在完成實踐內(nèi)容后,抽選若干實踐成果由學生準備PPT及講稿,上臺演示匯報成果。
2.1 Connection對象理解與實踐
Connection對象,代表與數(shù)據(jù)源進行的唯一會話。若是應(yīng)用于客戶端/服務(wù)器(Client/Server, C/S)數(shù)據(jù)庫系統(tǒng),它等價于與服務(wù)器的實際網(wǎng)絡(luò)連接。Connection對象就像數(shù)據(jù)庫系統(tǒng)與應(yīng)用系統(tǒng)之間一座橋梁,通過架設(shè)這座橋梁實現(xiàn)數(shù)據(jù)庫與應(yīng)用系統(tǒng)之間的通訊。以連接SQL Server數(shù)據(jù)庫為例,以下列出連接字符串的主要表達形式:
(1)使用windows身份驗證連接本地數(shù)據(jù)庫
string connString= @"Data Source=DESKTOP-GVLLFG5\SQLEXPRESS; Initial Catalog=db_My-time; Integrated Security=True”;
(2)使用SQL Server身份驗證連接制定的服務(wù)器MvServer用戶名和密碼均為sa
string connString = @”Data
Source=DESKTOP-GV—LLFG5\SQLEXPRESS; Integrated Security=false; User ID=sa;Password=sa":
f3)使用Persist SecuritV info連接本地數(shù)據(jù)庫
string connString = @”Data
Source=DESKTOP-CV—LLFG5\SQLEXPRESS; Persist Security Info=true; User ID=sa;Password=sa':
(4)使用SQL Express創(chuàng)建的本地數(shù)據(jù)庫,使用絕對路徑
string connString=@”Data Source=.\SQLEXPRESS; Attach-DbFilename=D:\db_Mytime.mdf; Persist Security Info=true; UserID=sa:Password=sa”:
從以上四種連接方式不難看出,在連接字符串中表達形式有明顯差異,如(1)中采用集成Windows登錄方式,這樣就無須用戶名和密碼,連接字符串中還包含“Initial CataLog”,其表示連接數(shù)據(jù)庫后的指定某個數(shù)據(jù)庫名。在實際項目中,僅適用于數(shù)據(jù)庫和開發(fā)應(yīng)用程序在同一臺計算機的情況。在教學過程中應(yīng)重點介紹(2)、(3)、(4)需用戶名、密碼登錄數(shù)據(jù)庫系統(tǒng)的情況,實際上,在工程項目中,應(yīng)用系統(tǒng)無論是開發(fā)過程中或投入正式運行,大多以用戶名和密碼的形式實現(xiàn)連接數(shù)據(jù)庫。
在教學中學生們可能無法全部理解和記住所有連接字符串的形式,因此,在講解過程中需進行總結(jié),總結(jié)這些連接字符串的一般形式“驅(qū)動類型+數(shù)據(jù)庫實例名+用戶名+密碼+服務(wù)器地址”,以讓學生對紛繁復(fù)雜的連接字符串形式中抽象出一般形式,更容易理解連接字符串的用法。
2.2 Command對象的理解與實踐
Command對象定義了將對數(shù)據(jù)源執(zhí)行的指定命令。包含三種常用執(zhí)行方法:1)ExecuteReader,將查詢結(jié)果返回到Da-taReader對象中;2)ExecuteScalar,返回結(jié)果集中的第一行的第一列;3)ExecuteNonQuery,執(zhí)行SQL語句并返回影響的行數(shù)。Command對象包括CommandText和Parameters屬性,其中Com-mandType包括soL語句和存儲過程兩種;后者指的是參數(shù)集合。
注意:若使用Command對象來完成執(zhí)行查詢,需將查詢字符串傳送給Connection對象的Execute方法或Recordset對象的Open方法。但是,當需要使命令文本具有持久性并重新執(zhí)行它,或使用查詢參數(shù)時,則必須使用Command對象。
2.3 DataReader對象的理解與實踐
DataReader對象只允許以只讀、順向的方式查看其中所存儲的數(shù)據(jù),提供一種非常高效的數(shù)據(jù)訪問模式,同時DataRead-er對象還是一種非常節(jié)省數(shù)據(jù)庫資源的訪問對象。
DataReader對象可通過Command對象的ExecuteReader方法從數(shù)據(jù)源中檢索數(shù)據(jù)來創(chuàng)建。如圖3所示。首先創(chuàng)建Sql-Connection對象,連接到soL Server數(shù)據(jù)庫;其次創(chuàng)建SqICom-mand對象的屬性,這些對象指定soL語句在數(shù)據(jù)庫中進行SE-LECT、INSERT、DELETE和UPDATE等數(shù)據(jù)操作;然后執(zhí)行Sql-Command對象的ExecuteReader方法執(zhí)行獲取結(jié)果,對結(jié)果進行遍歷,獲取滿足命令執(zhí)行的所有記錄;最后關(guān)閉Reader對象和SqlConnection對象。
在教學過程中,給出典型代碼如下:
SqlCommand cmd=new SqlCommand0;//創(chuàng)建command對象
cmd.Connection= conn; //設(shè)置連接對象
cmd.CommandText= strSql;//設(shè)置要查詢的sql語句
SqlDataReader reader= cmd.ExecuteReader0; //執(zhí)行
while (reader.Read0)//必須寫這個判斷,否則會報錯。讀取reader中的記錄,并自動到下一條。
(
string name= reader[”name”//將reader對象當前的指向行的“name”列的值讀取到字符串name中
}
reader.close0; //DataReader對象必須使用完之后關(guān)閉,否則會影響其它數(shù)據(jù)的操作。
通過以上代碼不難看出,通過DataReader對象實現(xiàn)數(shù)據(jù)流讀取,需要通過遍歷的手段獲取到數(shù)據(jù)的完整信息。調(diào)用Da-taReader對象的Read0方法逐行讀取數(shù)據(jù)。此方法返回一個布爾值,如果讀到一行記錄,返回True,否則返回False,
加入?yún)?shù)化形式和存儲過程形式的典型代碼。
using (SqIConnection conn= new SqIConnection(sConnection-String》 //創(chuàng)建conn連接對象
{ conn.Open0;//打開conn數(shù)據(jù)庫
using (SqICommand cmd= new SqICommand(”CreateBoard”,conn》
{
cmd.CommandType= CommandType.StoredProcedure;//以存儲過程的形式
cmd. Parameters. Add(”@ClassName”, SqlDbType. VarChar,50);//參數(shù)ClassName,類型varchar,長度50
cmd.Parameters[”@ClassName”].Value=tbClassName.Text;
cmd. Parameters. Add(”@BoardName”, SqlDbType. VarChar,50);//參數(shù)BoardName,類型varchar,長度50
cmd.Parameters[”@BoardName”].Value=tbBoardName.Text;
cmd.ExecuteNonQuery0;
)
)
通過以上代碼可以看出如何使用參數(shù)化形式和存儲過程來實現(xiàn)數(shù)據(jù)庫操作,該方式由于能夠防止soL注入和執(zhí)行效率高等優(yōu)點,在實際工程項目中被廣泛使用。
2.4 DataAdapter對象的理解與實踐
DataAdapter表示一組soL命令和一個數(shù)據(jù)庫連接,它們用于填充DataSet和更新數(shù)據(jù)源。DataSet對象表示數(shù)據(jù)源中數(shù)據(jù)的本地副本,它是.NET Framework的一個主要創(chuàng)新。如圖4所示。首先創(chuàng)建SqIConnection對象,連接到SQL Server數(shù)據(jù)庫;其次創(chuàng)建SqIDataAdapter對象。該對象包含能夠指向4個Sql-Command對象的屬性;然后創(chuàng)建包含一個或多個表的DataSet對象,使用SqIDataAdapter對象,通過調(diào)用Fill方法來填充Data-Set表,在準備將數(shù)據(jù)更改返回數(shù)據(jù)庫時,可以使用SqIData-Adapter并調(diào)用Update方法;最后關(guān)閉SqIConnection對象。
在教學過程中,給出典型代碼如下:
SqIDataAdapter DA= new SqIDataAdapter(strSQL, con);
DataSet ds= new DataSet0;//裝填
DA.Fill(ds);
dataGridViewl.DataSource= ds.Tables[0];//將獲取到的結(jié)果表綁定到dataGridVidew中
以舉例的方式解釋DataAdapter和DataSet之間的關(guān)系,若將數(shù)據(jù)庫database視為倉庫的話,那么DataAdapter就好比大貨車,DataSet就是臨時倉庫,大貨車在倉庫與臨時倉庫之間運輸數(shù)據(jù)。
3 結(jié)束語
通過多個學期的C#程序設(shè)計課程數(shù)據(jù)庫編程技術(shù)教學實踐,在課堂上,把數(shù)據(jù)庫編程知識點融入實踐任務(wù)中去,加大實踐課時的投入,給學生提供參與、分享任務(wù)作品的機會。通過這一系列的措施,提升學生對數(shù)據(jù)庫編程知識點的理解層次和運用能力,使學生在任務(wù)實踐中了解“學以致用”的道理,取得了良好的教學實踐效果。
參考文獻:
[1]高賢君,楊元維,李功權(quán).面向計算思維的Web程序設(shè)計教學思考[Jl.電腦知識與技術(shù),2018,14(21):147-149.
[2]楊元維,高賢君.計算思維在WebGIS開發(fā)與應(yīng)用教學中的 研討[J].電腦知識與技術(shù),2018,14(28):106-107+115.
[3]梁紅碩.存儲過程在C#數(shù)據(jù)庫編程中的應(yīng)用[J].科技風,2014(1):83-83.
[4]左丹霞.C#語言開發(fā)中的數(shù)據(jù)庫編程技術(shù)分析[J].通訊世界,2015(19):252-253.
[5]洪健.C#中的數(shù)據(jù)庫編程技術(shù)研究[J].計算機光盤軟件與應(yīng)用,2014(17):265-266.
[6]柴君.C#數(shù)據(jù)庫應(yīng)用編程探析[J].無線互聯(lián)科技,2014(7):161-162.
[7]朱立才,黃津津.C#中的數(shù)據(jù)庫編程技術(shù)[J].福建電腦,2005(08):95-96.
[8]孟燕,基于MOOC的高職“C#程序設(shè)計”在線課程開發(fā)與實踐[J].電子制作,2017(12):63-64.
【通聯(lián)編輯:王力】
收稿日期:2019-10-25
基金項目:地理國情監(jiān)測國家測繪地理信息局重點實驗室開放基金(2016NGCM07);長江科學院開放研究基金資助項目(CK-WV2017537/KY);長江青年基金資助(2016cqn04);長江大學創(chuàng)新創(chuàng)業(yè)協(xié)同育人計劃
作者簡介:高賢君(1986-),女,湖北荊門人,講師,博士,主要研究方向為遙感影像智能解譯;楊元維(1983-),男,湖北武漢人,講師,博士,主要研究方向為矢量匹配、軌跡數(shù)據(jù)匹配、遙感解譯。