2009-06-17 156 views
2

一個存儲過程我有這樣一個存儲過程:呼叫從.NET

CREATE PROCEDURE up_action 
(@id int 
,@group varchar(30)='' 
,@nom varchar(30)='' 
,@compte varchar(30)=NULL 
) 
AS 
BEGIN 
DECLARE @chrono int 
...... 
select @date=date from users where [email protected] 
INSERT INTO dialog 
(numappel,auteur,commentaire,etape,etapews,operant) 
VALUES 
(@numappel,@nomprenom,@dialogue,14,14,@nomoperateur) 
SET @chrono = SCOPE_IDENTITY()  
select 'chrono'[email protected] 
END 

我想從C#編寫與給由分隔的參數(實際可能性的應用程序調用此存儲過程它們的值),並在那之後最終接收一個記錄集rs,從中我可以得到像rs(「chrono」)這樣的變量的值。

我知道與創建各項參數,並告訴類型,名稱,值等 的可能性,但我要像在ASP的方法,因爲我有100個參數的程序...

回答

1

所以..解決辦法是:

SqlCommand sqlCommand = new SqlCommand(); 
sqlCommand.CommandText = strQuery; 
rdr = sqlCommand.ExecuteReader(); 
rdr.Read(); 
int chrono = Convert.ToInt32(rdr["chrono"]) 

而對於2參數

rdr.NextResult(); 
rdr.Read(); 
int str = Convert.ToInt32(rdr["str"]); 

謝謝大家對你的答案

+0

我不知道你的理解是正確的...也許我誤解你了。但是一個參數就是你作爲輸入發送給存儲過程(以及你添加到cmd.Parameters集合的東西(參見上面的答案))。結果集是存儲過程返回的內容。如果返回多個結果集(我認爲您的過程不是這種情況),則只需要NextResult()。 – fretje 2009-06-17 13:38:03

1

呃,如果你希望讓任務更容易看起來像LINQ to SQL。

6

通常情況下,用POADO(普通老式ADO.Net),你會做這樣的事情:

using (SqlConnection conn = new SqlConnection(myConnectionString)) 
using (SqlCommand cmd = conn.CreateCommand()) 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = "up_action" 
    cmd.Parameters.AddWithValue("@group", group); 
    cmd.Parameters.AddWithValue("@nom", nom); 
    cmd.Parameters.AddWithValue("@compte", compte); 
    conn.Open(); 
    using (SqlDataReader rd = cmd.ExecuteReader()) 
    { 
     if (rd.Read()) 
     { 
      chrono = rs["chrono"]; 
     } 
    } 
} 

但正如理查德指出:你確實比較好看看像LINQ到SQL,因爲這港島線產生每個存儲過程的一種方法(每個存儲過程的參數自動有一個參數)。有關更多信息,請參閱this link

0

您可能還想看看Enterprise Libray中的數據訪問應用程序塊,因爲這提供了良好的數據訪問模式。我還建議你再看看你的SP,看看你是否可以重構它們,100個參數聽起來相當過分。

0

我想這是一個插入/更新過程... 100個參數聽起來對我來說太多了,但如果這是你需要的,那麼你可能想看一下表值參數(僅適用於SQL 2008):

http://msdn.microsoft.com/en-us/library/bb675163.aspx

(首先,雖然,我會跟上面的建議去看看像LINQ的ORM - 這會採取繁重出了問題)