日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
簡單學(xué)習(xí)Linqtosql存儲過程

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

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

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

然后打開IDE的服務(wù)器資源管理器,之前我們從表中拖動表到dbml設(shè)計視圖,這次我們從存儲過程中找到剛才創(chuàng)建的存儲過程,然后拖動到設(shè)計視圖。在方法面板中可以看到已經(jīng)創(chuàng)建了一個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為這個Linq to sql存儲過程單獨(dú)生成了返回結(jié)果集的實(shí)體定義,你可能會覺得很奇怪,IDE怎么知道這個存儲過程將會返回哪些數(shù)據(jù)那?其實(shí),在把存儲過程拖拽入dbml設(shè)計視圖的時候,IDE就執(zhí)行了類似下面的命令:

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

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

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

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

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

在這里確實(shí)是Linq to object的,因?yàn)椴樵兙浞ú粫徽浞g成SQL,而是從Linq to sql存儲過程存儲過程的返回對象中再去對對象進(jìn)行查詢。SQL代碼如下:

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

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

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

 
 
 
  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)  

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

 
 
 
  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存儲過程存儲過程的輸出參數(shù)被封裝成了ref參數(shù),對于C#語法來說非常合情合理。SQL代碼如下

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

Linq to sql存儲過程之帶返回值的存儲過程

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

 
 
 
  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)行測試:

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

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

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

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

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

找到生成的存儲過程方法:

 
 
 
  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會把多結(jié)果集Linq to sql存儲過程識別為單結(jié)果集存儲過程(只認(rèn)識第一個結(jié)果集),我們只能對Linq to sql存儲過程方法多小動手術(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. }  

然后使用下面的代碼測試:

 
 
 
  1. var 多結(jié)果集存儲過程 = ctx.sp_multiresultset();   
  2. var Customers = 多結(jié)果集存儲過程.GetResult();   
  3. var Employees = 多結(jié)果集存儲過程.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存儲過程新增數(shù)據(jù)

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

 
 
 
  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存儲過程從服務(wù)器資源管理器拖拽到設(shè)計視圖上。右鍵點(diǎn)擊tbGuestBook實(shí)體類,選擇配置行為。如下圖,為插入操作選擇剛才創(chuàng)建的存儲過程方法,并進(jìn)行參數(shù)匹配:

由于我們的Linq to sql存儲過程只接受2個參數(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),在提交修改的時候調(diào)用了下面的SQL:

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

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

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

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

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

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

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

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

 
 
 
  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ù)都指定當(dāng)前值。回復(fù)留言后可以跟蹤到下面的SQL:

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

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

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

 
 
 
  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 = 5; Prec = 0; Scale = 0) [admin]   
  7. -- @p1: Input AnsiString (Size = 8; Prec = 0; Scale = 0) [notadmin]   
  8. -- @RETURN_VALUE: Output Int32 (Size = 0; Prec = 0; Scale = 0) []  

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


本文標(biāo)題:簡單學(xué)習(xí)Linqtosql存儲過程
URL分享:http://www.dlmjj.cn/article/cdjpiep.html