首页 > 代码库 > Linq to sql-存储过程

Linq to sql-存储过程

带参数的存储过程

创建如下存储过程:

create proc [dbo].[sp_withparameter]@customerid nchar(5),@rowcount int outputasset nocount onset @rowcount = (select count(*) from customers where customerid = @customerid)

使用同样的方法生成存储过程方法,然后使用下面的代码进行测试:

int? rowcount = -1;        ctx.sp_withparameter("", ref rowcount);        Response.Write(rowcount);        ctx.sp_withparameter("ALFKI", ref rowcount);        Response.Write(rowcount);

结果输出了“01”。说明ID为“”的顾客数为0,而ID为“ALFKI”的顾客数为1。存储过程的输出参数被封装成了ref参数,对于C#语法来说非常合情合理。SQL代码如下:

EXEC @RETURN_VALUE = [dbo].[sp_withparameter] @customerid = @p0, @rowcount = @p1 OUTPUT-- @p0: Input StringFixedLength (Size = 5; Prec = 0; Scale = 0) []-- @p1: InputOutput Int32 (Size = 0; Prec = 0; Scale = 0) [-1]-- @RETURN_VALUE: Output Int32 (Size = 0; Prec = 0; Scale = 0) []

带返回值的存储过程

再来创建第三个存储过程:

create proc [dbo].[sp_withreturnvalue]@customerid nchar(5)asset nocount onif exists (select 1 from customers where customerid = @customerid)return 101elsereturn 100

生成方法后,可以通过下面的代码进行测试:

Response.Write(ctx.sp_withreturnvalue(""));Response.Write(ctx.sp_withreturnvalue("ALFKI"));

运行后程序输出“100101”

多结果集的存储过程

再来创建一个多结果集的存储过程:

create proc [dbo].[sp_multiresultset]asset nocount onselect * from customersselect * from employees
[Function(Name="dbo.sp_multiresultset")]    public ISingleResult<sp_multiresultsetResult> sp_multiresultset()    {        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));        return ((ISingleResult<sp_multiresultsetResult>)(result.ReturnValue));    }

由于现在的VS2008会把多结果集存储过程识别为单结果集存储过程(只认识第一个结果集),我们只能对存储过程方法多小动手术,修改为:

[Function(Name="dbo.sp_multiresultset")]    [ResultType(typeof(Customer))]    [ResultType(typeof(Employee))]    public IMultipleResults sp_multiresultset()    {        IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())));        return (IMultipleResults)(result.ReturnValue);    }

然后使用下面的代码测试:

var 多结果集存储过程 = ctx.sp_multiresultset(); var Customers = 多结果集存储过程.GetResult<Customer>(); var Employees = 多结果集存储过程.GetResult<Employee>(); GridView1.DataSource = from emp in Employees where emp.FirstName.Contains("A") select emp; GridView1.DataBind(); GridView2.DataSource = from c in Customers where c.CustomerID.StartsWith("A") select c; GridView2.DataBind();

使用存储过程新增数据

 

Linq to sql-存储过程