2011-07-15 62 views
1

我想從這樣的數據庫返回標標:返回從SQL Server到C#

DbConnection cn = GetConnection2(); 
cn.Open(); 

// stored procedure 
DbCommand cmd = GetStoredProcCommand(cn, "GetReason"); 
DbParameter param; 

param = CreateInParameter("Reason_Number", DbType.String); 
param.Value = number; 
cmd.Parameters.Add(param); 

param = CreateOutParameter("Result", DbType.String); 
param.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(param); 

cmd.ExecuteScalar(); 

string reason; 
reason = cmd.Parameters["@Result"].Value.ToString(); 

if (cn.State == ConnectionState.Open) 
    cn.Close(); 

return reason; 

這裏是我的存儲過程:

-- ============================================= 
-- Create date: Today 
-- Description: Input Reason # and Return Full Reason Name 
-- ============================================= 
ALTER PROCEDURE [dbo].[GetReason] 
    @Reason_Number nvarchar(50), 
    @Result nvarchar(50) output 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    SELECT @Result = Field1 
    FROM dbo.Reasons 
    WHERE Field1 LIKE @Reason_Number + '%'; 
END 

我就收到一個錯誤ExecuteScalar行:

System.InvalidOperationException發生
消息=「字符串[1]:第e Size屬性的無效大小爲0.「

我在做什麼錯?

+0

@marc感謝。我該如何解決它? –

回答

4

如果你想使用ExecuteScalar,你的存儲過程需要從SELECT返回單行,單柱:

ALTER PROCEDURE [dbo].[GetReason] 
    @Reason_Number nvarchar(50) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    SELECT Field1 
    FROM dbo.Reasons 
    WHERE Field1 LIKE @Reason_Number + '%'; 
END 

,然後你的代碼需要讀取值:

var returnedValue = cmd.ExecuteScalar(); 

並從那裏使用它。當然,在這種情況下,你也不必OUTPUT參數在C#代碼....

字的警告:即SELECT在你的存儲過程可能可能返回多行。你可能想一個TOP 1添加到您的選擇 - 只要是安全的:

SELECT TOP 1 Field1 
    FROM dbo.Reasons 
    WHERE Field1 LIKE @Reason_Number + '%'; 
+0

你對存儲過程做了什麼改變,我沒有看到它謝謝 –

+0

我從參數列表中刪除了OUTPUT參數('@ Result'),並且我改變了'SELECT'語句只返回值 - 不分配它到輸出參數 –

1

只需添加另一個語句將存儲過程的結束和刪除OUTPUT參數

SELECT @Result as 'Result'