存储过程return与output区别
共同点:都返回值(但return只能返回int类型)
不同点:
1.output是定义变量是不是可以返回值
2.output没有return从查询或过程中无条件退出的工功
3.return返回值在函数和过程定义时不需要用output来定义
我想用存储过程,是一个查询的存储过程. 把查询的记录返回.net里我接收这个返回的记录集. 怎么弄呀?
------------------------------
(1)执行一个没有参数的存储过程的代码如下:
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.selectCommand = new SqlCommand();
da.selectCommand.Connection = conn;
da.selectCommand.CommandText = "NameOfProcedure";
da.selectCommand.CommandType = CommandType.StoredProcedure;
(2)执行一个有参数的存储过程的代码如下
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.selectCommand = new SqlCommand();
da.selectCommand.Connection = conn;
da.selectCommand.CommandText = "NameOfProcedure";
da.selectCommand.CommandType = CommandType.StoredProcedure;
param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.Input;
param.Value = Convert.ToDateTime(inputdate);
da.selectCommand.Parameters.Add(param);
若需要添加输出参数:
param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.Output; '输出参数
param.Value = Convert.ToDateTime(inputdate);
da.selectCommand.Parameters.Add(param);
若要获得参储过程的返回值:
param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.ReturnValue; '返回值:
param.Value = Convert.ToDateTime(inputdate);
da.selectCommand.Parameters.Add(param);=================
在asp.net中调用存储过程代码:
int i = 2;
string ConnStr = "server=.;database=doc;uid=sa;pwd=admin;";
SqlConnection conn = new SqlConnection(ConnStr);
SqlCommand comm = new SqlCommand("proc_stu", conn); //建立一个命令
comm.CommandType = CommandType.StoredProcedure; //说明执行的是一个存储过程 comm.Parameters.Add(new SqlParameter("@sname", SqlDbType.Char, 20)); //定义一个存储过程变量
comm.Parameters["@sname"].Value = "admin"; //给存储过程变量赋值 comm.Parameters.Add(new SqlParameter("@pwd", SqlDbType.Char, 20)); //定义一个存储过程变量
comm.Parameters["@pwd"].Value = "admin"; comm.Connection.Open(); //打开连接
try
{
i= (int)comm.ExecuteScalar(); // ExecuteScalar:返回第一行第一列值
}
catch (SqlException er)
{
Response.Write(er.ToString()); //向上一级抛异常
}
finally
{
comm.Connection.Close();
conn.Close();
}
Response.Write(i.ToString());
例2:
存储过程既可以在查询分析器中编写,也可以在企业管理器中编写。最重要是学会其语法。SQL Sever 联机帮助中有详细的说明。下面的存储过程实现用户验证的功能,如果不成功,返回0,成功则返回1.
CREATE PROCEDURE VALIDATE @USERNAME CHAR(20),@PASSWORD CHAR(20),@LEGAL BIT OUTPUT
AS
IF EXISTS(SELECT * FROM REN WHERE SNAME = @USERNAME AND PWD = @PASSWORD)
SELECT @LEGAL = 1
ELSE
SELECT @LEGAL = 0
在程序中调用该存储过程,并根据@LEGAL参数的值判断用户是否合法。
.net 中显示返回值主要代码
comm.Parameters.Add("@LEGAL", 0);
comm.Parameters["@LEGAL"].Direction = ParameterDirection.Output;
comm.ExecuteNonQuery(); //ExecuteNonQuery:返回影响的行数
i = (int)comm.Parameters["@LEGAL"].Value;
Response.Write(i.ToString());
===============================
两种不同的存储过程调用方法
为了突出新方法的优点,首先介绍一下在.NET中调用存储过程的“官方”方法。另外,本文的所有示例程序均工作于SqlServer数据库上,其它情况类似,以后不再一一说明。本文所有例子均采用C#语言。
要在应用程序中访问数据库,一般性的步骤是:首先声明一个数据库连接SqlConnection,然后声明一个数据库命令SqlCommand,用来执行SQL语句和存储过程。有了这两个对象后,就可以根据自己的需要采用不同的执行方式达到目的。需要补充的是,不要忘记在页面上添加如下的引用语句:using System.Data.SqlClient。
就执行存储过程来说,如果执行的是第一类存储过程,那么就要用一个DataAdapter将结果填充到一个DataSet中,然后就可以使用数据网格控件将结果呈现在页面上了;如果执行的是第二和第三种存储过程,则不需要此过程,只需要根据特定的返回判定操作是否成功完成即可。
(1)执行一个没有参数的存储过程的代码如下:
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = "NameOfProcedure";
da.SelectCommand.CommandType = CommandType.StoredProcedure;
然后只要选择适当的方式执行此处过程,用于不同的目的即可。
(2)执行一个有参数的存储过程的代码如下(我们可以将调用存储过程的函数声明为ExeProcedure(string inp
utdate)):
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = "NameOfProcedure";
da.SelectCommand.CommandType = CommandType.StoredProcedure;
(以上代码相同,以下为要添加的代码)
param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.Input;
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);
这样就添加了一个输入参数。若需要添加输出参数:param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.Output;
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param);
若要获得参储过程的返回值:param = new SqlParameter("@ParameterName", SqlDbType.DateTime);
param.Direction = ParameterDirection.ReturnValue;
param.Value = Convert.ToDateTime(inputdate);
da.SelectCommand.Parameters.Add(param); 从上面的代码我们可以看出,当存储过程比较多或者存储过程的参数比较多时,这种方法会大大影响开发的速度;另外一方面,如果项目比较大,那么这些用于数据库逻辑的函数在以后的维护中也是一个很大的负担。那么,有没有一种改进的方法可以解决这个问题呢?想到在执行没有参数的存储过程时只需要传入一个存储过程的名字就可以调用相应的存储过程,而且在SqlServer数据库中我们可以直接在查询分析器中敲入“存储过程名(参数列表)”样的字符串就可以执行存储过程,那么,是否可以把这种思想应用到应用程序中呢?
于是在编译器中键入相应代码。这些代码是在调用不带参数的存储过程的代码的基础上改的。具体代码如下:
SqlConnection conn=new SqlConnection(“connectionString”);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = "NameOfProcedure(’para1’,’para2’,para3)";
da.SelectCommand.CommandType = CommandType.StoredProcedure;
为了使代码更具有代表性,要调用的存储过程的第一个和第二个参数都为字符串类型,第三个参数为整型。执行以后发现,完全可以达到预期的效果! 两种调用方法的比较
通过比较我们可以看到,第二种方法具有一个很明显的优点,那就是可以提高开发速度,节省开发时间,而且代码容易维护,在一定程度上也减少了系统大小。但是,由于对存储过程参数的处理比较笼统,如果要获取输出参数或者得到存储过程的返回值,这种方法就不能满足需要了。虽然如此,但是,这种方法毕竟可以让开发人员少些很大一部分的代码。如果不需要获取输出参数和返回值,那么几乎可以做到“一劳永逸”。因此在实际的程序开发中,这种方法还是具有一定的实用价值的。=================
Public Shared Function kwkj_user_serverInRole_addrole(ByVal username As String, ByVal rolename As String, ByVal serveronid As Integer, ByVal yearnum As Integer) As Integer
Using connection As New SqlConnection(ConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString)
Using command As New SqlCommand("kwkj_user_ServerInRole_addrole1", connection)
command.CommandType = CommandType.StoredProcedure
Dim p As SqlParameter = command.Parameters.Add("@Return_Value", SqlDbType.Int) '标准参数的写法
p.Direction = ParameterDirection.ReturnValue' 定义参数的传输类型是returnvalue
command.Parameters.Add(New SqlParameter("@username", username))
command.Parameters.Add(New SqlParameter("@rolename", rolename))
command.Parameters.Add(New SqlParameter("@serveronid", serveronid))
command.Parameters.Add(New SqlParameter("@yearnum", yearnum))
Dim list As Integer
Try
connection.Open()
command.ExecuteNonQuery()
list = CInt(p.Value) '取得存储过程的返回值
Catch ex As Exception
Finally
connection.Close()
End Try
Return list '返回值 End Using
End Using
End Function
========================
返回存储过程OUTPUT参复和RETURN返回值的原代码---------------------------------
ALTER PROCEDURE sp_2
@p int output,
@p1 int,
@p2 int
as
set @p = @p1+@p2
return 99
---------------------------------http://www.86oo.com/提供各类教程
Function returnP()
Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = CurrentProject.Connection mailto:%20@return_value"这个参数在输入参数的最前面,名称是固定的
cmd.Parameters.Append cmd.CreateParameter("@return_value", adInteger, adParamReturnValue)'输入和输出的参数顺序同存储过程的参数顺序
cmd.Parameters.Append cmd.CreateParameter("@p", adInteger, adParamOutput)
cmd.Parameters.Append cmd.CreateParameter("@p1", adInteger, adParamInput,,1)
cmd.Parameters.Append cmd.CreateParameter("@p2", adInteger, adParamInput,,2)
cmd.CommandText = "sp_2"
cmd.CommandType = adCmdStoredProc
cmd.Execute
Dim i As Integer
For i = 0 To cmd.Parameters.Count - 1
Debug.Print cmd.Parameters(i).Name & "=" & cmd.Parameters(i).Value
Next iSet cmd.ActiveConnection = Nothing
Set cmd = Nothing
End Function'----------测试---------
? returnP()
@return_value=99
@p=3
@p2=2
@p1=1
============================如何在存储过程中调用存储过程?大家给个例子?
======
create proc kk
as
begin
exec jj --jj为存储过程名
end
=======
create table test(id int,name varchar(10))
insert into test select 1,'AAAA'
insert into test select 2,'BBBB'
go
create procedure sp_test1(@count int output)
as
select @count=count(*) from test
go
create procedure sp_test2
as
begin
declare @count int
exec sp_test1 @count output
select @count
end
go
exec sp_test2
go
--输出结果
/*
2
*/
drop procedure sp_test2,sp_test1
drop table test
go
---------------------
1,存储过程create proc dbo.SPd_test
as
begin
return 2;
end2,得到return 的值
DECLARE @RC int
EXEC @RC = [eppoo].[dbo].[SPd_test]
DECLARE @PrnLine nvarchar(4000)
PRINT ''''存储过程: eppoo.dbo.SPd_test''''
SELECT @PrnLine = '''' 返回代码 = '''' + CONVERT(nvarchar, @RC)
PRINT @PrnLine