自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

簡單學(xué)習(xí)Linq to sql存儲(chǔ)過程

開發(fā) 后端
本文在介紹Linq to sql存儲(chǔ)過程之前,先來介紹一下普通存儲(chǔ)過程,這樣更有助于大家對(duì)Linq to sql存儲(chǔ)過程的理解。

在介紹Linq to sql存儲(chǔ)過程之前,先來介紹一下普通存儲(chǔ)過程,這樣更有助于大家對(duì)Linq to sql存儲(chǔ)過程的理解。

首先在查詢分析器運(yùn)行下面的代碼來創(chuàng)建一個(gè)存儲(chǔ)過程:

  1. create proc sp_singleresultset   
  2. as   
  3. set nocount on   
  4. select * from customers   

然后打開IDE的服務(wù)器資源管理器,之前我們從表中拖動(dòng)表到dbml設(shè)計(jì)視圖,這次我們從存儲(chǔ)過程中找到剛才創(chuàng)建的存儲(chǔ)過程,然后拖動(dòng)到設(shè)計(jì)視圖。在方法面板中可以看到已經(jīng)創(chuàng)建了一個(gè)sp_singleresultset的方法。

然后打開Northwind.designer.cs,可以找到下面的代碼:

  1. [Function(Name="dbo.sp_singleresultset")]   
  2. public ISingleResult sp_singleresultset()   
  3. {   
  4. IExecuteResult result = this.ExecuteMethodCall(this, 
  5. ((MethodInfo)(MethodInfo.GetCurrentMethod())));   
  6. return ((ISingleResult)(result.ReturnValue));   
  7. }  

我們可以發(fā)現(xiàn),IDE為這個(gè)Linq to sql存儲(chǔ)過程單獨(dú)生成了返回結(jié)果集的實(shí)體定義,你可能會(huì)覺得很奇怪,IDE怎么知道這個(gè)存儲(chǔ)過程將會(huì)返回哪些數(shù)據(jù)那?其實(shí),在把存儲(chǔ)過程拖拽入dbml設(shè)計(jì)視圖的時(shí)候,IDE就執(zhí)行了類似下面的命令:

  1. SET FMTONLY ON;   
  2. exec Northwind.dbo.sp_singleresultset   
  3. SET FMTONLY OFF;  

這樣就可以直接獲取Linq to sql存儲(chǔ)過程返回的元數(shù)據(jù)而無須執(zhí)行存儲(chǔ)過程。

其實(shí)我們存儲(chǔ)過程返回的就是顧客表的數(shù)據(jù),如果你覺得為存儲(chǔ)過程單獨(dú)設(shè)置結(jié)果集實(shí)體有些浪費(fèi)的話可以在存儲(chǔ)過程的屬性窗口中調(diào)整返回類型從“自動(dòng)生成的類型”到Customer,不過以后你只能通過刪除方法面板中的存儲(chǔ)過程,然后重新添加來還原到“自動(dòng)生成的類型”。下面,我們可以寫如下的Linq to object代碼進(jìn)行查詢:

var 單結(jié)果集存儲(chǔ)過程 =

  1. from c in ctx.sp_singleresultset()   
  2. where c.CustomerID.StartsWith("A")   
  3. select c;  

在這里確實(shí)是Linq to object的,因?yàn)椴樵兙浞ú粫?huì)被整句翻譯成SQL,而是從Linq to sql存儲(chǔ)過程存儲(chǔ)過程的返回對(duì)象中再去對(duì)對(duì)象進(jìn)行查詢。SQL代碼如下:

  1. EXEC @RETURN_VALUE = [dbo].[sp_singleresultset]   
  2. -- @RETURN_VALUE: Output Int32 (Size = 0Prec = 0Scale = 0) []  

Linq to sql存儲(chǔ)過程之帶參數(shù)的存儲(chǔ)過程

創(chuàng)建如下存儲(chǔ)過程:

  1. create proc [dbo].[sp_withparameter]   
  2. @customerid nchar(5),   
  3. @rowcount int output   
  4. as   
  5. set nocount on   
  6. set @rowcount = (select count(*) from customers where 
  7. customerid = @customerid)  

使用同樣的方法生成存儲(chǔ)過程方法,然后使用下面的代碼進(jìn)行測(cè)試:

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

結(jié)果輸出了“01”。說明ID為“”的顧客數(shù)為0,而ID為“ALFKI”的顧客數(shù)為1。Linq to sql存儲(chǔ)過程存儲(chǔ)過程的輸出參數(shù)被封裝成了ref參數(shù),對(duì)于C#語法來說非常合情合理。SQL代碼如下

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

Linq to sql存儲(chǔ)過程之帶返回值的存儲(chǔ)過程

再來創(chuàng)建第三個(gè)存儲(chǔ)過程:

  1. create proc [dbo].[sp_withreturnvalue]   
  2. @customerid nchar(5)   
  3. as   
  4. set nocount on   
  5. if exists (select 1 from customers where customerid = @customerid)   
  6. return 101   
  7. else   
  8. return 100  

生成方法后,可以通過下面的代碼進(jìn)行測(cè)試:

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

運(yùn)行后程序輸出“100101”

Linq to sql存儲(chǔ)過程之多結(jié)果集的存儲(chǔ)過程

再來創(chuàng)建一個(gè)多結(jié)果集的存儲(chǔ)過程:

  1.  create proc [dbo].[sp_multiresultset]   
  2. as   
  3. set nocount on   
  4. select * from customers   
  5. select * from employees  

找到生成的存儲(chǔ)過程方法:

  1.  [Function(Name="dbo.sp_multiresultset")]   
  2. public ISingleResult sp_multiresultset()   
  3. {   
  4. IExecuteResult result = this.ExecuteMethodCall(this,
  5.  ((MethodInfo)(MethodInfo.GetCurrentMethod())));   
  6. return ((ISingleResult)(result.ReturnValue));   
  7. }  

由于現(xiàn)在的VS2008會(huì)把多結(jié)果集Linq to sql存儲(chǔ)過程識(shí)別為單結(jié)果集存儲(chǔ)過程(只認(rèn)識(shí)第一個(gè)結(jié)果集),我們只能對(duì)Linq to sql存儲(chǔ)過程方法多小動(dòng)手術(shù),修改為:

  1. [Function(Name="dbo.sp_multiresultset")]   
  2. [ResultType(typeof(Customer))]   
  3. [ResultType(typeof(Employee))]   
  4. public IMultipleResults sp_multiresultset()   
  5. {   
  6. IExecuteResult result = this.ExecuteMethodCall(this, 
  7. ((MethodInfo)(MethodInfo.GetCurrentMethod())));   
  8. return (IMultipleResults)(result.ReturnValue);   
  9. }  

然后使用下面的代碼測(cè)試:

  1. var 多結(jié)果集存儲(chǔ)過程 = ctx.sp_multiresultset();   
  2. var Customers = 多結(jié)果集存儲(chǔ)過程.GetResult();   
  3. var Employees = 多結(jié)果集存儲(chǔ)過程.GetResult();  
  4. GridView1.DataSource = from emp in Employees where 
  5. emp.FirstName.Contains("A") select emp;  
  6.  GridView1.DataBind();   
  7. GridView2.DataSource = from c in Customers where 
  8. c.CustomerID.StartsWith("A") select c;  
  9. GridView2.DataBind(); 

使用Linq to sql存儲(chǔ)過程新增數(shù)據(jù)

存儲(chǔ)過程除了可以直接調(diào)用之外,還可以用于實(shí)體的增刪改操作。還記得在《一步一步學(xué)Linq to sql(三):增刪改》中創(chuàng)建的留言簿程序嗎?下面我們就來改造這個(gè)程序,使用存儲(chǔ)過程而不是系統(tǒng)生成的SQL實(shí)現(xiàn)實(shí)體增刪改。首先,我們創(chuàng)建下面的Linq to sql存儲(chǔ)過程。

  1. create proc sendmessage   
  2. @username varchar(50),   
  3. @message varchar(500)   
  4. as   
  5. insert into tbguestbook   
  6. (id,username,posttime,[message],isreplied,reply)   
  7. values   
  8. (newid(),@username,getdate(),@message,0,'')  

然后,打開留言簿dbml,把Linq to sql存儲(chǔ)過程從服務(wù)器資源管理器拖拽到設(shè)計(jì)視圖上。右鍵點(diǎn)擊tbGuestBook實(shí)體類,選擇配置行為。如下圖,為插入操作選擇剛才創(chuàng)建的存儲(chǔ)過程方法,并進(jìn)行參數(shù)匹配:

由于我們的Linq to sql存儲(chǔ)過程只接受2個(gè)參數(shù),相應(yīng)修改以下創(chuàng)建留言的按鈕處理事件:

  1. protected void btn_SendMessage_Click(object sender, EventArgs e)   
  2. {   
  3. tbGuestBook gb = new tbGuestBook();   
  4. gb.UserName = tb_UserName.Text;   
  5. gb.Message = tb_Message.Text;   
  6. ctx.tbGuestBooks.Add(gb);   
  7. ctx.SubmitChanges();   
  8. SetBind();   
  9. }  

運(yùn)行程序后可以發(fā)現(xiàn),在提交修改的時(shí)候調(diào)用了下面的SQL:

  1.  EXEC @RETURN_VALUE = [dbo].[sendmessage] @username = @p0, @message = @p1   
  2. -- @p0: Input AnsiString (Size = 5Prec = 0Scale = 0) [zhuye]   
  3. -- @p1: Input AnsiString (Size = 11Prec = 0Scale = 0) [new message]   
  4. -- @RETURN_VALUE: Output Int32 (Size = 0Prec = 0Scale = 0) []  

使用Linq to sql存儲(chǔ)過程刪除數(shù)據(jù)

創(chuàng)建如下Linq to sql存儲(chǔ)過程:

  1.  create proc delmessage   
  2. @id uniqueidentifier   
  3. as   
  4. delete tbguestbook where id=@id  

按照前面的步驟生成Linq to sql存儲(chǔ)過程方法,并為刪除操作執(zhí)行這個(gè)存儲(chǔ)過程方法。在選擇參數(shù)的時(shí)候我們可以看到,ID分當(dāng)前值和原始值,我們選擇當(dāng)前值即可無須改動(dòng)任何邏輯代碼,進(jìn)行刪除留言操作后可以跟蹤到下面的SQL:

  1.  EXEC @RETURN_VALUE = [dbo].[delmessage] @id = @p0   
  2. -- @p0: Input Guid (Size = 0Prec = 0Scale = 0
  3. [9e3c5ee3-2575-458e-899d-4b0bf73e0849]   
  4. -- @RETURN_VALUE: Output Int32 (Size = 0Prec = 0Scale = 0) []  

Linq to sql存儲(chǔ)過程之使用存儲(chǔ)過程更改數(shù)據(jù)

創(chuàng)建如下存儲(chǔ)過程:

  1. create proc replymessage   
  2. @id uniqueidentifier,   
  3. @reply varchar(500)   
  4. as   
  5. update tbguestbook set reply=@reply,isreplied=1 where id=@id  

由于更新的時(shí)候并不會(huì)更新主鍵,所以我們可以為兩個(gè)參數(shù)都指定當(dāng)前值?;貜?fù)留言后可以跟蹤到下面的SQL:

  1.  EXEC @RETURN_VALUE = [dbo].[replymessage] @id = @p0, @reply = @p1   
  2. -- @p0: Input Guid (Size = 0Prec = 0Scale = 0)
  3.  [67a69d0f-a88b-4b22-8939-fed021eb1cb5]   
  4. -- @p1: Input AnsiString (Size = 6Prec = 0Scale = 0) [464456]   
  5. -- @RETURN_VALUE: Output Int32 (Size = 0Prec = 0Scale = 0) []  

假設(shè)有這樣一種應(yīng)用,我們需要修改留言簿中不合法的用戶名:

  1.  create proc modiusername   
  2. @oldusername varchar(50),   
  3. @newusername varchar(50)   
  4. as   
  5. update tbguestbook set username=@newusername where 
  6. username = @oldusername  

有個(gè)網(wǎng)友起名叫“admin”,我們要把所有這個(gè)名字修改為“notadmin”。那么,可以如下圖設(shè)置update操作:

然后運(yùn)行下面的測(cè)試代碼: 

  1. var messages = from gb in ctx.tbGuestBooks   
  2. select gb;   
  3. foreach (var gb in messages)   
  4. {   
  5. if(gb.UserName == "admin")   
  6. gb.UserName = "notadmin";   
  7. }  

運(yùn)行程序后能跟蹤到下面的SQL:

  1. SELECT [t0].[ID], [t0].[UserName], [t0].[PostTime], [t0].[Message], 
  2. [t0].[IsReplied], [t0].[Reply]   
  3. FROM [dbo].[tbGuestBook] AS [t0]   
  4. EXEC @RETURN_VALUE = [dbo].[modiusername] @oldusername = 
  5. @p0, @newusername = @p1   
  6. -- @p0: Input AnsiString (Size = 5Prec = 0Scale = 0) [admin]   
  7. -- @p1: Input AnsiString (Size = 8Prec = 0Scale = 0) [notadmin]   
  8. -- @RETURN_VALUE: Output Int32 (Size = 0Prec = 0Scale = 0) []  

Linq to sql存儲(chǔ)過程就看到這里了,你應(yīng)該能明白當(dāng)前值和原始值的含義了吧。

【編輯推薦】

  1. 詳談Linq查詢結(jié)果分析的方法
  2. 簡簡單單學(xué)習(xí)Linq查詢語法
  3. 詳細(xì)闡述Linq插入數(shù)據(jù)的操作方法
  4. 淺析Linq插入數(shù)據(jù)的實(shí)現(xiàn)方法
  5. 簡單解決Linq多條件組合問題
責(zé)任編輯:阡陌 來源: 天極網(wǎng)
相關(guān)推薦

2009-09-17 15:22:38

LINQ to SQL

2009-09-17 10:40:23

linq存儲(chǔ)過程

2009-09-17 10:04:32

LINQ存儲(chǔ)過程

2009-09-11 09:41:19

LINQ to SQL

2009-09-08 13:16:01

Linq to SQL

2009-09-09 10:54:52

Linq存儲(chǔ)過程返回

2009-09-15 11:08:01

LinQ調(diào)用存儲(chǔ)過程

2011-03-28 10:28:46

sql存儲(chǔ)過程

2009-09-15 13:37:24

Linq To Sql

2009-09-15 13:53:53

Linq To Sql

2010-09-27 16:04:00

2009-09-13 19:24:33

LINQ存儲(chǔ)過程

2009-09-07 17:09:45

Linq To Sql

2009-09-11 12:08:09

Linq to SQL

2009-08-17 18:30:29

C# SQL Serv

2009-09-17 11:32:52

LINQ調(diào)用存儲(chǔ)過程

2010-07-09 10:48:02

SQL Server存

2009-09-17 08:47:00

Linq查詢

2009-09-17 16:20:43

Linq to sql

2011-04-13 09:45:15

Oracle存儲(chǔ)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)