c 與返回多表的儲存過程

2021-09-08 09:31:39 字數 1882 閱讀 7928

儲存過程返回值的**:

方法一:output

create

procedure

[dbo

].[p_getsomething

]@id

varchar(20

),@info

int output

方法二:select

create

procedure

[dbo

].[p_getsomething

]@id

varchar(20)as

set nocount on

select

*from dbo.[

table1

]select

*from dbo.[

table2

]select

*from dbo.[

table3

]

方法三:return

create

procedure

[dbo

].[p_getsomething

]@id

varchar(20)as

set nocount on

return

0

在linq to sql的dbml檔案中,拖進相應的儲存過程,在design.cs中會自動生成呼叫方法。其中,output的返回值會用ref的引數來承載,而return的值直接反映在方法的返回型別中。select的返回型別是乙個表,在c#端會自動生成乙個p_getsomething的型別,型別的結構與返回表的有相同的字段屬性。但是,如果儲存過程返回的是多個表會怎麼樣呢?多個表的情況,c#端只會自動生成第乙個表的返回**。

return的**:

dbo.p_getsomething")]

public

varchar(20)

")] string id)

output+select的**:

dbo.p_getsomething")]

varchar(20)

int")] ref system.nullableinfo)

多個select的情況:

dbo.p_getsomething")]

varchar(20)

")] string id)

如果想將多個select的表全部返回,修改**如下:

dbo.p_getsomething")]

[resulttype(

typeof

(tablea))]

[resulttype(

typeof

(tableb))]

[resulttype(

typeof

(tablec))]

varchar(20)

")] string id)

在資料獲取的執行端,呼叫賦值時,一定要按照順序,不能先取tablec,再取tablea

var result =db.p_getsomething(id);

var a = result.getresult().tolist();

var b = result.getresult().tolist();

var c = result.getresult().tolist();

另外還要注意,linq是延遲查詢語句,所以在這裡取值時,全部用tolist阻止了延遲。這樣做的原因是因為,如果出現了延遲查詢,或者多次查詢,資料的輸出順序一直都是先a後b最後c,我們賦值時,可能用tablec xx = result.getresult(); 這時result輸出的資料可能是tablea,就會引起型別不對的錯誤。有點類似佇列,先進先出的原則,有一定的取值順序。

多表查詢的儲存過程分頁

該儲存過程源程式引用 http jiny z.cnblogs.com archive 2006 04 12 373146.html,由於其中多表操作時有乙個bug,做了改進,修改的部分紅色標示,解決了 primarykey table.id 表名.主鍵 時,引數 type無法賦值,進而查詢結果為空的...

多表查詢分頁儲存過程

set ansi nulls on set quoted identifier on go 支援多表查詢分頁儲存過程 事理改進 2012.3 多表聯查1 declare count int exec proc datapagination sl article a,sl user u u.realn...

C 呼叫儲存過程返回值

c 源 1 2 校驗使用者 3 4 使用者資訊 5 6public static intverifyuser clsuser user 7 user.username,user.password 執行的t sql串 10sqlcommand scmd new sqlcommand sql,conn ...