成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

簡單學習Linq to sql存儲過程

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

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

首先在查詢分析器運行下面的代碼來創建一個存儲過程:

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

然后打開IDE的服務器資源管理器,之前我們從表中拖動表到dbml設計視圖,這次我們從存儲過程中找到剛才創建的存儲過程,然后拖動到設計視圖。在方法面板中可以看到已經創建了一個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. }  

我們可以發現,IDE為這個Linq to sql存儲過程單獨生成了返回結果集的實體定義,你可能會覺得很奇怪,IDE怎么知道這個存儲過程將會返回哪些數據那?其實,在把存儲過程拖拽入dbml設計視圖的時候,IDE就執行了類似下面的命令:

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

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

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

var 單結果集存儲過程 =

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

在這里確實是Linq to object的,因為查詢句法不會被整句翻譯成SQL,而是從Linq to sql存儲過程存儲過程的返回對象中再去對對象進行查詢。SQL代碼如下:

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

Linq to sql存儲過程之帶參數的存儲過程

創建如下存儲過程:

  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)  

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

  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);  

結果輸出了“01”。說明ID為“”的顧客數為0,而ID為“ALFKI”的顧客數為1。Linq to sql存儲過程存儲過程的輸出參數被封裝成了ref參數,對于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存儲過程之帶返回值的存儲過程

再來創建第三個存儲過程:

  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  

生成方法后,可以通過下面的代碼進行測試:

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

運行后程序輸出“100101”

Linq to sql存儲過程之多結果集的存儲過程

再來創建一個多結果集的存儲過程:

  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. }  

由于現在的VS2008會把多結果集Linq to sql存儲過程識別為單結果集存儲過程(只認識第一個結果集),我們只能對Linq to sql存儲過程方法多小動手術,修改為:

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

存儲過程除了可以直接調用之外,還可以用于實體的增刪改操作。還記得在《一步一步學Linq to sql(三):增刪改》中創建的留言簿程序嗎?下面我們就來改造這個程序,使用存儲過程而不是系統生成的SQL實現實體增刪改。首先,我們創建下面的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存儲過程從服務器資源管理器拖拽到設計視圖上。右鍵點擊tbGuestBook實體類,選擇配置行為。如下圖,為插入操作選擇剛才創建的存儲過程方法,并進行參數匹配:

由于我們的Linq to sql存儲過程只接受2個參數,相應修改以下創建留言的按鈕處理事件:

  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. }  

運行程序后可以發現,在提交修改的時候調用了下面的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存儲過程刪除數據

創建如下Linq to sql存儲過程:

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

按照前面的步驟生成Linq to sql存儲過程方法,并為刪除操作執行這個存儲過程方法。在選擇參數的時候我們可以看到,ID分當前值和原始值,我們選擇當前值即可無須改動任何邏輯代碼,進行刪除留言操作后可以跟蹤到下面的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存儲過程之使用存儲過程更改數據

創建如下存儲過程:

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

由于更新的時候并不會更新主鍵,所以我們可以為兩個參數都指定當前值。回復留言后可以跟蹤到下面的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) []  

假設有這樣一種應用,我們需要修改留言簿中不合法的用戶名:

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

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

然后運行下面的測試代碼: 

  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. }  

運行程序后能跟蹤到下面的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存儲過程就看到這里了,你應該能明白當前值和原始值的含義了吧。

【編輯推薦】

  1. 詳談Linq查詢結果分析的方法
  2. 簡簡單單學習Linq查詢語法
  3. 詳細闡述Linq插入數據的操作方法
  4. 淺析Linq插入數據的實現方法
  5. 簡單解決Linq多條件組合問題
責任編輯:阡陌 來源: 天極網
相關推薦

2009-09-17 15:22:38

LINQ to SQL

2009-09-17 10:40:23

linq存儲過程

2009-09-17 10:04:32

LINQ存儲過程

2009-09-08 13:16:01

Linq to SQL

2009-09-11 09:41:19

LINQ to SQL

2009-09-09 10:54:52

Linq存儲過程返回

2009-09-15 11:08:01

LinQ調用存儲過程

2009-09-15 13:53:53

Linq To Sql

2009-09-15 13:37:24

Linq To Sql

2011-03-28 10:28:46

sql存儲過程

2009-09-07 17:09:45

Linq To Sql

2009-09-11 12:08:09

Linq to SQL

2009-09-13 19:24:33

LINQ存儲過程

2010-09-27 16:04:00

2009-08-17 18:30:29

C# SQL Serv

2009-09-17 11:32:52

LINQ調用存儲過程

2009-09-17 08:47:00

Linq查詢

2010-07-09 10:48:02

SQL Server存

2009-09-17 16:20:43

Linq to sql

2011-04-13 09:45:15

Oracle存儲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产伦精品一区二区三毛 | 免费av一区二区三区 | 99久久精品国产毛片 | 夜夜精品浪潮av一区二区三区 | 亚洲精品一区二区在线 | 91在线一区| 毛片一级电影 | 精品1区2区3区 | 国产999精品久久久 精品三级在线观看 | 8x国产精品视频一区二区 | 中国毛片免费 | 国产一区二区三区在线观看免费 | 日韩美av | 天天看夜夜 | 秋霞电影一区二区 | 国产96色在线 | 色婷婷久久 | 福利片在线看 | 成人片免费看 | 一级网站 | 国产精品久久久久久久久 | 91免费观看视频 | 亚洲毛片在线观看 | 日韩欧美在线观看 | 色婷婷av一区二区三区软件 | 国产亚洲欧美日韩精品一区二区三区 | 日韩成人一区二区 | 538在线精品| 国产精品一区二区三区四区 | 国产精品毛片一区二区三区 | 欧美中文字幕一区二区三区亚洲 | 欧美成人精品在线观看 | 中文日韩在线 | 欧美成视频 | 国产精品久久久久久吹潮 | 亚洲欧美日韩精品久久亚洲区 | 国产精品久久久久久久久免费高清 | 三级成人在线 | 激情网站在线观看 | 亚洲精彩视频 | 人人干免费 |