前言
老实说我之前还不知道 “ 存储过程 ” 是何物,但是项目中要用到这个,被迫在短时间内学习了一下 (。>︿<)_θ
存储过程
存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,有利于提高数据处理的效率。
但要注意的是存储过程并不比 SQL 语句执行的更快。
优点:
1、重复使用:存储过程可以重复使用,从而可以减少数据库开发人员的工作量。
2、减少网络流量:存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
3、安全性:参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
缺点:
1、调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。
2、移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
3、重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
4、 如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。
上面对存储过程的优缺点总结的很到位,就抄了过来 (●’◡’●)
C# 调用 SQL Server 存储过程
要调用存储过程,首先要有存储过程。
下面是一个数据库 test ,里面有一个 ShoppingCart 表,表里面存储着一些数据:
新建一个存储过程,搜索出 ShoppingCart 表中, 指定 CartID 所包含的所有商品(ProductName):
CREATE Procedure [dbo].[ShoppingCartItemCount] ( @CartID nvarchar(50) ) AS Begin SELECT ProductName FROM ShoppingCart WHERE CartID = @CartID; RETURN; END;
数据库里执行一下:
用 C# 调用这个存储过程:
private void Form1_Load(object sender, EventArgs e) { //配置数据库连接属性 SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder(); scsb.DataSource = "localhost"; scsb.InitialCatalog = "test"; scsb.UserID = "sa"; scsb.Password = "1234"; //新建数据库连接并打开 SqlConnection conn = new SqlConnection(scsb.ToString()); conn.Open(); //此处调用存储过程 SqlCommand cmd = new SqlCommand("ShoppingCartItemCount", conn); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(new SqlParameter("@CartID", SqlDbType.VarChar)); cmd.Parameters["@CartID"].Value = "007"; cmd@(@->.)ExecuteNonQuery(); //接收存储过程返回的数据 SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); adapter.Fill(ds); foreach (DataRow col in ds.Tables[0].Rows) { textBox1.AppendText(col[0].ToString() + "\r\n"); } }
运行结果:
上面是带输入输出参入的存储过程的调用,其他还比如无输入参数的存储过程的调用,方法都与之类似,有一篇博客写的不错,地址:https://www.cnblogs.com/hongmaju/p/4571615.html