• Linq to sql-存储过程


    带参数的存储过程

    创建如下存储过程:

    create proc [dbo].[sp_withparameter]
    @customerid nchar(5),
    @rowcount int output
    as
    set nocount on
    set @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)
    as
    set nocount on
    if exists (select 1 from customers where customerid = @customerid)
    return 101
    else
    return 100

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

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

    运行后程序输出“100101”

    多结果集的存储过程

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

    create proc [dbo].[sp_multiresultset]
    as
    set nocount on
    select * from customers
    select * 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();

    使用存储过程新增数据

  • 相关阅读:
    Java实现荷兰国旗问题
    Java实现荷兰国旗问题
    QTcpSocket 对连接服务器中断的不同情况进行判定(六种情况,其中一种使用IsNetworkAlive API方法)
    怀旧老游戏
    我的第一个Chrome插件:天气预报应用
    ddd
    Android 反编译工具
    ASP.NET MVC局部视图
    jQuery类库的设计
    jquery+html三级联动下拉框
  • 原文地址:https://www.cnblogs.com/dekevin/p/5851829.html
Copyright © 2020-2023  润新知