这个玩意称为存储过程,类似于其他编程语言中的函数,它含有可与IF,WHILE等这样的编程构造所结合的SQL语句,以编译的形式保存在数据库中。存储过程可用来编写数据库中处理事务的代码。
它可以做SQL所可以做的所有事情!!!
它的特点是:
1,可以接受输入参数,以输出参数的形式给调用过程返回多个值。
2,可以给调用过程或批处理返回状态值,表示成功或失败。
3,可以调用其它存储过程并执行它们。
4,允许模块化编程,就是说可以独立于应用程序创建它们,可以在不重新编译应用程序的情况下修改它们。
5,允许以更快的速度执行。在客户-服务器系统中,使用存储过程可以大大的提高性能。
6,减少网络通信量。
7,可以使用安全机制。
在程序中,StoredProcedure是单独存储的。但是它是和数据库是联系在一起的。
我们可以使用visual studio的Server Explorer,来查看StoredProcedure。
当将 CommandType 属性设置为 StoredProcedure 时,应将 CommandText 属性设置为存储过程的名称。当调用“执行”(Execute) 方法之一时,该命令将执行此存储过程。
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText="sp_Select_AllEmployees";
还记得这两句代码吗?这是在components的源文件中常见的。
虽然可以通过以 SQL 语句的形式传递参数自变量之前的存储过程名称来调用存储过程,但如果使用 ADO.NET Command 对象的 Parameters 集合,则可以显式地定义存储过程参数并访问输出参数和返回值。
Parameter 对象可以使用 Parameter 构造函数来创建,或通过调用 Command 的 Parameters 集合的 Add 方法来创建。Parameters.Add 会将构造函数参数或现有 Parameter 对象用作输入。
对于 Input 参数之外的参数,必须设置 ParameterDirection 属性来指定参数类型是 InputOutput、Output 还是 ReturnValue。默认情况下,是输入参数。
看一段实际代码
SqlCommand sampleCMD = new SqlCommand("SampleProc", nwindConn);
sampleCMD.CommandType = CommandType.StoredProcedure;
SqlParameter sampParm = sampleCMD.Parameters.Add("RETURN_VALUE", SqlDbType.Int);
sampParm.Direction = ParameterDirection.ReturnValue;
sampParm = sampleCMD.Parameters.Add("@InputParm", SqlDbType.NVarChar, 12);
sampParm.Value = "Sample Value";
sampParm = sampleCMD.Parameters.Add("@OutputParm", SqlDbType.NVarChar, 28);
sampParm.Direction = ParameterDirection.Output;
nwindConn.Open();
SqlDataReader sampReader = sampleCMD.ExecuteReader();
Console.WriteLine("{0}, {1}", sampReader.GetName(0), sampReader.GetName(1));
while (sampReader.Read())
{
Console.WriteLine("{0}, {1}", sampReader.GetInt32(0), sampReader.GetString(1));
}
sampReader.Close();
nwindConn.Close();
Console.WriteLine(" @OutputParm: {0}", sampleCMD.Parameters["@OutputParm"].Value);
Console.WriteLine("RETURN_VALUE: {0}", sampleCMD.Parameters["RETURN_VALUE"].Value);
ReturnValue:用来捕捉StoredProcedure的Return值。
使用Output参数返回值的存储过程非常有用,他们可用于从数据库中检索几份信息,但信息互不相关,或者在结果集中获取信息。
了解一下使用了StoredProcedure的应用程序,它们一般分成两个部分:
1,StoredProcedure:
ALTER PROCEDURE sp_Dates_ByEmployeeId
(
@EmployeeID int,
@EDate datetime OUTPUT,
@LDate datetime OUTPUT
)
AS
/* SET NOCOUNT ON */
SELECT @EDate=Min(OrderDate)
FROM Orders
WHERE EmployeeId=@EmployeeID
SELECT @LDate=Max(OrderDate)
FROM Orders
WHERE EmployeeId=@EmployeeID
RETURN
2,应用程序的对应部分:
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText="sp_Dates_ByEmployeeId";
SqlParameter parInput = cmd.Parameters.Add("@EmployeeId",SqlDbType.Int);
parInput.Direction = ParameterDirection.Input;
parInput.Value = Convert.ToInt32(txtEmpId2.Text);
SqlParameter parOutput2 = cmd.Parameters.Add("@LDate",SqlDbType.DateTime);
parOutput2.Direction = ParameterDirection.Output;
SqlParameter parOutput1 = cmd.Parameters.Add("@EDate",SqlDbType.DateTime);
parOutput1.Direction = ParameterDirection.Output;