高賢君 楊元維


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