关于storedprocedure的信息
存储过程的名词解释
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升
c#如何调用 storedprocedure mysqlparameter
* precedure 中用@@rowcount 用来显示上条命令影响的行数
1. procedure 有输入参数,无返回值
procedure :
USE [biyi]
GO
create proc TEST2 (@v1 nvarchar(50),@v2 nvarchar(50))
as
SELECT * FROM PROCE
WHERE @v10 AND @v20
GO
C#中调用
String ConnStr = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;
using (SqlConnection conn = new SqlConnection(ConnStr))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "TEST2";//Procedure Name is TEST2
cmd.CommandType = CommandType.StoredProcedure;
IDataParameter[] parameters = {
new SqlParameter("@v1", c) , //Procedure 的第一个输入参数
new SqlParameter("@v2", SqlDbType.NVarChar,50), //Procedure 的第二个输入参数
};
parameters[0].Value = "1";
parameters[1].Value = "2";
cmd.Parameters.Add(parameters[0]); //或者 直接 cmd.Parameters.Add( "@v1",SqlDbType.NVarChar,50);
cmd.Parameters.Add(parameters[1]);
conn.Open();
SqlDataAdapter ad = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
ad.Fill(ds);
this.GridView1.DataSource = ds.Tables[0];
this.GridView1.DataBind();
}
2. procedure 有输入参数,也有返回值
Procedure:
USE [biyi]
GO
create proc TEST3 (@v1 nvarchar(50),@v2 nvarchar(50))
as
if @v1 @v2
return 1
else return 2
GO
C#中调用:
using (SqlConnection conn = new SqlConnection(ConnStr))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "TEST3";//Procedure Name
cmd.CommandType = CommandType.StoredProcedure;
IDataParameter[] parameters = {
new SqlParameter("@v1", SqlDbType.NVarChar,50) , //Procedure 的第一个输入参数
new SqlParameter("@v2", SqlDbType.NVarChar,50), //Procedure 的第二个输入参数
new SqlParameter("return", SqlDbType.NVarChar,50), //返回值
};
parameters[0].Value = "1";
parameters[1].Value = "2";
parameters[2].Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(parameters[0]);
cmd.Parameters.Add(parameters[1]);
cmd.Parameters.Add(parameters[2]);
conn.Open();
cmd.ExecuteNonQuery();
Label1.Text = parameters[2].Value.ToString();
}
何谓store procedure?该如何使用
正确写的话应该是stored procedure
中文翻成预储程序
简单的讲,就是资料库的副程式
不过大部分的情况是...
遇到一件要处理资料的问题时
DBA喜欢写stored procedure
Programmer喜欢在程式处理 XD
很难界定哪种是好或不好
下面有简单的教学
如何接收 Store Procedure 的傳回值
3 种方式:
使用 SELECT 以表格方式传回。
设定 Output Parameter 以参数方式传回。
使用 RETURN 传回 1 个整数型别的资料。
以下列出这 3 种传回方式,在 SQL 及 ADO.NET 中接收的方法。
一、使用 SELECT 以表格方式传回
我们先来看第 1 种,这也是我最常用的方式。
Store Procedure:
01 IF OBJECT_ID('mysp_QueryData') IS NOT NULL
02 DROP PROCEDURE mysp_QueryData
03 GO
04 CREATE PROCEDURE mysp_QueryData (
05 @id int
06 )
07 AS
08 BEGIN
09 SELECT LastName, FirstName
10 FROM Customer
11 WHERE CustomerID = @id;
12 END
在另一支预储程序中要接收此预储程序传回的资料,方法如下:
1 IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
2 DROP TABLE #tmp
3 GO
4 CREATE TABLE #tmp (lname varchar(30), fname varchar(10));
5 INSERT INTO #tmp EXEC mysp_QueryData '1';
6 SELECT * FROM #tmp;
1~2 行:判断若暂存资料表已存在则进行删除。
4~6 行:先建立暂存资料表,再使用 INSERT INTO 方式写入後即可对暂存资料表操作取值。
C#
01 SqlConnection conn = new SqlConnection(strConn);
02 SqlCommand cmd = new SqlCommand(string.Empty, conn);
03 conn.Open();
04
05 cmd.Parameters.Clear();
06 cmd.CommandType = CommandType.StoredProcedure;
07 cmd.CommandText = "mysp_QueryData";
08 cmd.Parameters.Add("@id", SqlDbType.Int).Value = 1;
09
10 SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow);
11
12 if (reader.HasRows)
13 {
14 reader.Read();
15 Console.WriteLine("Last Name:" + reader["LastName"]);
16 Console.WriteLine("First Name:" + reader["FirstName"]);
17 }
18
19 reader.Close();
20 reader.Dispose();
21
22 conn.Close();
23 conn.Dispose();
此例是以 ExecuteReader() 来进行读取,然後配合 SqlDataReader 物件将栏位值读出。
因传回的内容只有 1 个资料集,所以第 10 行在读取时可以使用 CommandBehavior.SingleRow 来接收传回的资料集,可结省资源及增进效率,但要注意,若是传回的内容有 2 个资料集以上,那麼使用 CommandBehavior.SingleRow 就无法读到第 2 个以後的资料集内容了。
假设传回内容只有 1 个传回值,或是只要读取传回的第 1 笔资料的第 1 个栏位值,可以使用 ExecuteScalar() 将 LastName 读出,如此上面 10~20 行的程式可改为如下:
1 string strName = Convert.ToString(cmd.ExecuteScalar());
2 Console.WriteLine("Last Name:" + strName);
二、设定 Output Parameter 以参数方式传回
Store Procedure:
01 CREATE PROCEDURE mysp_QueryData (
02 @id int,
03 @LastName Varchar(30) output
04 )
05 AS
06 BEGIN
07 SELECT @LastName = LastName
08 FROM Customer
09 WHERE CustomerID = @id;
10 END
关键在第 3 行,在参数後方加上 output 设定为输出参数。
在另一支预储程序中要接收此预储程序传回的输出参数方法如下:
1 DECLARE @lname varchar(30);
2 EXEC mysp_QueryData '1',@lname output;
3 PRINT @lname;
第 2 行:在执行预储程序後方指定参数时,要接收输出的参数设定 output 即可。
C#
01 SqlConnection conn = new SqlConnection(strConn);
02 SqlCommand cmd = new SqlCommand(string.Empty, conn);
03 conn.Open();
04
05 cmd.Parameters.Clear();
06 cmd.CommandType = CommandType.StoredProcedure;
07 cmd.CommandText = "mysp_QueryData";
08 cmd.Parameters.Add("@id", SqlDbType.Int).Value = 1;
09
10 SqlParameter lastName = cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 30);
11 lastName.Direction = ParameterDirection.Output;
12
13 cmd.ExecuteNonQuery();
14
15 Console.WriteLine("Last Name:" + lastName.Value);
16
17 conn.Close();
18 conn.Dispose();
第 10 行:建立要接收输出的参数名称资料,参数名称 @LastName 须与预储程序中的参数名称一样。
第 11 行:设定为输出参数。
第 15 行:用 .value 将传回资料取出。
三、使用 RETURN 传回单一数值
Store Procedure:
1 CREATE PROCEDURE mysp_InsData (
2 @LastName varchar(30),
3 @FirstName varchar(10)
4 )
5 AS
6 BEGIN
7 INSERT INTO Customer (LastName, FirstName) VALUES (@LastName, @FirstName);
8 RETURN SCOPE_IDENTITY();
9 END
在新增完资料後,使用 RETURN 返回新增资料的识别值。
在另一支预储程序中接收此预储程序传回的值:
1 DECLARE @intRow int;
2 EXEC @intRow = mysp_InsData 'Walter', 'Liao';
3 SELECT @intRow;
C#
01 SqlConnection conn = new SqlConnection(strConn);
02 SqlCommand cmd = new SqlCommand(string.Empty, conn);
03 conn.Open();
04
05 cmd.Parameters.Clear();
06 cmd.CommandType = CommandType.StoredProcedure;
07 cmd.CommandText = "mysp_InsData";
08 cmd.Parameters.Add("@LastName", SqlDbType.VarChar, 30).Value = "Walter";
09 cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 10).Value = "Liao";
10
11 SqlParameter retID = cmd.Parameters.Add("@ReturnValue", SqlDbType.Int);
12 retID.Direction = ParameterDirection.ReturnValue;
13
14 try
15 {
16 cmd.ExecuteNonQuery();
17 }
18 catch (Exception ex)
19 {
20 //当新增资料时若发生错误,可撰写程式将错误讯息记录下来
21 //InsErrorLog("mysp_InsData", ex.Message);
22 }
23
24 Console.WriteLine("Return Value:" + retID.Value);
25
26 conn.Close();
27 conn.Dispose();
第 11 行:建立要接收 RETURN 的参数,参数名称 @ReturnValue 可自定。
第 12 行:将参数设定为 Return Value。
第 24 行:用 .value 将传回资料取出。
过程或函数 'StoredProcedure1' 需要参数 '@starttime',但未提供该参数。
StoredProcedure1里有参数@starttime,你调用的时候没给它赋值。
调用存储过程方法
什么是sql中的stored procedures
stored
procedures
就是存储过程,就是已经命名的代码段。
这个和一般编程语言中的方法(函数)类似,可以实现循环、IF判断、异常处理等等。