zoukankan      html  css  js  c++  java
  • 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();

    使用存储过程新增数据

  • 相关阅读:
    分享:图书馆常用开源软件
    一个 Python 程序每一行的内存占用分析 杨超(星辰海 | 真人图书馆·Python 程序员) 42qu.com
    分享:使用 const_cast<> 改变map中 key 的值
    Examples · Remarkerbe
    内联函数
    什么值得买 » 体感神器?Leap Motion 运动控制器(Kinect的200倍精确度) $69.99预定(直邮中国运费$14.99)Leap Motion外设产品,新鲜物,海淘特价
    HiveClient
    sentry : 前端&后端 的 错误信息统计 张沈鹏(42qu.com·创始人&程序员) 42qu.com
    fabric
    fabric调用代码分析
  • 原文地址:https://www.cnblogs.com/dekevin/p/5851829.html
Copyright © 2011-2022 走看看