DELETE FROM mynews WHERE ID=3
上述代码指定删除了mynews表中ID为3的行。如果不编写WHERE子句,则该表中所有的行都能够达成删除的条件,则会删除表中所有的行,示例代码如下所示。
DELETE FROM mynews
在编写删除语句时,可以通过编写相应的条件来提高执行的效率。
9.4.2 使用Command对象删除记录
当需要执行删除语句,可以使用Command对象来删除数据库中的记录。Command对象的使用方法在前面的SQL语句介绍中已经讲的比较多了,在删除记录时,其使用方法基本相同。使用Command对象进行数据库操作的步骤基本如下所示。
? 创建数据库连接。
? 创建一个Command对象,并指定一个SQL DELETE(或存储过程)。
? 使用Command对象的ExecuteNonQuery()方法执行DELETE(或存储过程)。 ? 关闭数据库连接。
当需要执行DELETE语句时,首先必须要打开到数据库的连接,打开连接后,使用Command对象执行SQL语句,示例代码如下所示。
string str = \ SqlConnection con = new SqlConnection(str); con.Open(); //打开连接
完成数据库连接后,需创建一个新的Command对象,示例代码如下所示。
SqlCommand cmd = new SqlCommand(\
Command对象的构造函数的参数有两个,一个是需要执行的SQL语句,令一个是数据库连接对象。 创建Command对象后,就可以执行SQL命令,执行后完成并关闭数据连接,示例代码如下所示。
cmd.ExecuteNonQuery(); con.Close();
//执行SQL命令 //关闭连接
9.4.3 使用DataSet数据集删除记录
使用DataSet删除记录和使用DataSet更新记录非常的相似,DataSet删除记录的步骤如下所示。 ? 创建一个Connection对象。 ? 创建一个DataAdapter对象。 ? 初始化适配器。
? 使用数据适配器的Fill方法执行SELECT命令,并填充DataSet。 ? 执行SqlCommandBuilder方法生成UpdataCommand方法。 ? 创建DataTable对象并指定相应的DataSet中的表。 ? 创建DataRow对象并查找需要修改的相应行。 ? 使用Delete方法删除该行。
? 使用Updata方法进行数据更新。
在删除记录前,首先需要创建连接,示例代码如下所示。
string str = \ SqlConnection con = new SqlConnection(str); con.Open();
253
string strsql = \
上述代码创建了与数据库的连接,并编写SQL查询语句来填充DataSet。填充DataSet对象需使用DataAdapter,示例代码如下所示。
SqlDataAdapter da = new SqlDataAdapter(strsql, con); SqlCommandBuilder build = new SqlCommandBuilder(da); DataSet ds = new DataSet(); da.Fill(ds, \
编写完成后,需要创建DataTable对象对DataSet中相应的数据进行操作,其代码和更新记录基本相同,示例代码如下所示。
DataTable tb = ds.Tables[\
tb.PrimaryKey = new DataColumn[] { tb.Columns[\ DataRow row = tb.Rows.Find(3);
在进行删除之前,同样需要找到相应的行,来指定删除语句所需要删除的行,示例代码如下所示。
row.Delete();
读者可以看到,DataSet删除方法与更新方法不同的地方只操作语句的不同,在更新中使用的是Update()方法,而在删除中使用的是Delete()方法。
注意:当使用Delete方法删除记录行的时候,可以通过调用DataRow对象的RejectChanges方法取消对记录的删除,当使用该方法删除记录行时,该行的状态会恢复为Unchanged。
在删除完毕后,同样需要保持DataSet中的数据和数据库中的数据的一致性,示例代码如下所示。
da.Update(ds, \
使用Update方法能够使DataSet中的数据和数据库中的数据保持一致性,在ASP中,这种方法也比较常见。
9.5 使用存储过程
存储过程在开发过程中经常被使用,因为存储过程能够将数据操作和程序操作在代码上分离,而且存储过程相对于SQL语句而言,具有更好的性能和安全性,使用存储过程能够提高应用程序的性能和安全性。
9.5.1 存储过程的优点
在数据库操作中,已经有了SQL语句,为何还需要存储过程。因为存储过程有SQL语句不能具备的特点和优点,以至于存储过程能在严格的数据库驱动的应用程序中起到重要的作用。存储和过程有点包括:
? 事务处理。 ? 速度和性能。 ? 过程控制。 ? 安全性。
? 减少网络流量和通信。 ? 模块化。
1.事务处理
存储过程中,包括多个SQL语句,存储过程中的SQL语句属于事务处理的范畴。也就是说,存储
254
过程类似于一个函数,当执行存储过程时,存储过程中的SQL语句要不都执行,要不都不执行。
2.速度和性能
存储过程由数据库服务器编译和优化,优化包括使用存储过程在运行时所必须的特定数据库的结构信息,这样在执行过程中会节约很多时间。存储过程完全在数据库服务器上执行,避免了大量的SQL语句代码的传递,对于循环使用SQL语句而言,存储过程在速度和性能上都被优化。
3.过程控制
在编写存储过程中,可以使用IF ELSE、FOR以及WHILE循环,这些语句并不能在SQL语句中编写,但是可以在存储过程中编写。当需要进行大量的和复杂的操作时,SQL语句需要通过和编程语言一同编写才能实现,而且实现复杂。相比之下,存储过程可以对过程进行控制。
4.安全性
存储过程也可以作为额外的安全层。开发人员或者用户,都只能对数据库中的存储过程进行使用,而无法直接对表进行数据操作,这样封装了数据操作,提高安全性。
5.减少网络流量和通信
存储过程是在数据库服务器上运行的,在使用存储过程中,无需将大量的SQL语句代码传递给数据库服务器,而只需告诉数据库服务器执行哪个存储过程即可,而数据库服务器则会自行执行中间处理操作,而不会通过网络传递不必要的数据。
6.模块化
正如代码编写规范和设计模式一样,通常情况下,开发团队或者公司需要严谨的代码编写风格和良好的协调能力,例如一个团队有人专门负责编码,有人专门负责数据库开发,那么可以让数据库开发人员负责数据库的开发,而编码的程序员只需要使用数据库开发人员设计的存储过程即可。在这种情况下,数据库操作和应用程序编码的操作被分开,在维护、管理中,也非常方便,如果数据库存储过程的代码出现问题,则只需要修改存储过程中的代码即可。
9.5.2 创建存储过程
存储过程可以通过SQL Server Management Studio创建,也可以使用.NET框架通过编程实现.SQL Server Management Studio创建存储过程比较方便,右击【对象资源管理器】中的相应的数据库,在下拉菜单中选择【可编程性】选项并选择【存储过程】选项。单击右键,选择【新建存储过程】选项,系统会自动创建一个新的标签(tab)窗口,以提供输入存储过程语句,如图9-3所示。
255
图9-3 使用Server Management Studio创建存储过程
在tab窗口中输入存储过程,代码如下所示。
CREATE PROC myproc (
@id int,
@title varchar(50) OUTPUT ) AS
SET NOCOUNT ON
DECLARE @newscount int
SELECT @title=mynews.title,@newscount=COUNT(mynews.id) FROM mynews WHERE (id=@id)
GROUP BY mynews.title RETURN @newscount
上述存储过程返回了数据库中新闻的标题内容。“@id”表示新闻的id,@title表示新闻的标题,此存储过程将返回“@title”的值,并且返回新闻的总数。在C#中同样可以使用编程实现存储过程的创建,示例代码如下所示。
string str = \ \
\
\ \ \
\
\
\ \ \
\ \
SqlCommand cmd = new SqlCommand(str, con); cmd.ExecuteNonQuery(); //使用cmd的ExecuteNonQuery方法创建存储过程
256
上述代码通过使用SqlCommand对象的ExecuteNonQuery()方法在数据库中创建了一个存储过程,该存储过程用于返回了数据库中新闻的标题内容。
9.5.3 调用存储过程
创建存储过程之后,可以在.NET应用程序中使用存储过程。存储过程可以看成是一个函数,可以对存储过程进行调用,传递参数,接受返回值。在调用存储过程前,首先要与数据库建立连接,示例代码如如下所示。
string str = \ SqlConnection con = new SqlConnection(str); con.Open(); //打开连接
建立与数据库连接后,需要使用Command对象使用存储过程,Command对象接受的两个参数分别为SQL语句和Connection对象,在使用存储过程时,其中表示SQL语句的参数可以直接编写为存储过程名,代码如下所示。
SqlCommand cmd = new SqlCommand(\
//使用存储过程
默认情况下,Command对象的类型是SQL语句,必须将Command对象的CommandType属性设置为存储过程,系统才会调用存储过程,示例代码如下所示。
cmd.CommandType = CommandType.StoredProcedure;
//设置Command对象的类型 //表示执行一个存储过程 //增加参数id //增加参数title
//该参数是输出参数 //增加count参数 //该参数是返回值 //为参数初始化 //为参数初始化
设置执行类型后,需要为存储过程增加参数,示例代码如下所示。
SqlParameter spr; spr = cmd.Parameters.Add(\ spr = cmd.Parameters.Add(\ spr.Direction = ParameterDirection.Output; spr = cmd.Parameters.Add(\ spr.Direction = ParameterDirection.ReturnValue; cmd.Parameters[\ cmd.Parameters[\
参数设置完毕后,执行ExecuteNonQuery方法能够执行存储过程,就相当于开始调用函数,示例代码如下所示。
cmd.ExecuteNonQuery();
//执行存储过程 //获取返回值
当存储过程执行完毕后,能够获取参数和返回值,示例代码如下所示。
Label1.Text = cmd.Parameters[\
使用SQL Server Management Studio同样能够执行存储过程,单击存储过程,单击右键,选择执行存储过程,系统会提示输入参数,如图9-4所示。输入相应的参数,单击确定,系统会执行存储过程并返回相应的值,如图9-5所示。
257