高贤君 杨元维
摘要:针对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-),男,湖北武汉人,讲师,博士,主要研究方向为矢量匹配、轨迹数据匹配、遥感解译。