2014-01-25 34 views
0

我一直在摔跤這幾天,並已廣泛挖通過StackOverflow和各種其他網站。我從字面上畫空白。我試圖從我的存儲過程中獲得單個結果。從SQL Server存儲過程獲取單一響應與C#

這裏是我的存儲過程:

ALTER PROC [dbo].[myHelper_Simulate] 
    @CCOID nvarchar(100), @RVal nvarchar OUTPUT 
AS 
    DECLARE @UserID int 
    DECLARE @GUID uniqueidentifier 

    SELECT @UserID = UserID 
    FROM [User] 
    WHERE CCOID = @CCOID AND deleted = 0 

    SELECT @GUID = newid() 

    IF @UserID > 0 
     BEGIN 
      INSERT [Audit] ([GUID], Created, UserID, ActionType, Action, Level) 
      VALUES (@GUID, getdate(), @UserID, 'Authentication', 'Test Authentication', 'Success') 

      SELECT @RVal = 'http://www.ttfakedomain.com/Logon.aspx?id=' + CAST(@GUID AS nvarchar(50)) 
      RETURN 
     END 
    ELSE 
     SELECT @RVal = 'Couldn''t find a user record for the CCOID ' + @CCOID 
     RETURN 
GO 

最初的程序被寫入打印出結果。我已經添加了@RValRETURN以嘗試讓值返回到我的C#代碼。

這裏是我的C#程序(svrConn已經連接到數據庫):

private void btnSimulate_MouseClick(object sender, MouseEventArgs e) 
{ 
     SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = svrConn; 
     object result = new object(); 

     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = "[" + tDatabase + "].[dbo].myHelper_Simulate"; 
     cmd.Parameters.Add(new SqlParameter("@CCOID", txtDUserCCOID.Text.Trim())); 
     cmd.Parameters.Add(new SqlParameter("@RVal", "")); 
     cmd.Parameters.Add(new SqlParameter("RETURN_VALUE", SqlDbType.NVarChar)).Direction = ParameterDirection.ReturnValue; 

     try 
     { 
      result = cmd.ExecuteScalar(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 

     if (result != null) 
     { 
      tString = result.ToString(); 
      MessageBox.Show(tString); 
     } 
    } 

的問題是,result是回來了空。我不確定這是由於存儲過程還是我如何設置我的參數並致電ExecuteScalar

+0

Tim不要忘記在using語句中包裝commend,以免泄漏資源或氾濫連接池。 – Kane

回答

1

不需要返回參數或輸出參數。 ExecuteScalar返回結果集第一行的第一列。因此,只需選擇您想要返回的文本,就像這樣...

IF @UserID > 0 
     BEGIN 
      INSERT [Audit] ([GUID], Created, UserID, ActionType, Action, Level) 
      VALUES (@GUID, getdate(), @UserID, 'Authentication', 'Test Authentication', 'Success') 

      SELECT 'http://www.ttfakedomain.com/Logon.aspx?id=' + CAST(@GUID AS nvarchar(50)) 
     END 
    ELSE 
     SELECT 'Couldn''t find a user record for the CCOID ' + @CCOID 


RETURN 
+0

就是這樣!我知道它必須與存儲過程有關,並且我是如何將信息傳遞回去的。我根據您的建議更改了proc,並刪除了C#代碼中的最後2個parameter.add語句以及代碼。謝謝。 – Tim

0

嘗試

private void btnSimulate_MouseClick(object sender, EventArgs e) { 
    using (SqlConnection con = svrConn) { 
    using (SqlCommand cmd = new SqlCommand("myHelper_Simulate", con)) { 
     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.Add("@CCOID", SqlDbType.VarChar).Value = txtDUserCCOID.Text.Trim(); 
     var output = new SqlParameter("@RVal", SqlDbType.VarChar); 
     output.Direction = ParameterDirection.Output; 
     cmd.Parameters.Add(output); 

     con.Open(); 
     cmd.ExecuteNonQuery(); 
    } 
    } 
} 
+0

這是不正確的,因爲@rval需要是輸出參數。 –

+0

對不起。你的權利。我修改了 – mnshahab

3

SP return values是整數,是指爲錯誤代碼。正確的方法是使用OUTPUT參數。你在SP中正確地分配它,你不需要返回語句。

在您的C#代碼中檢查執行後的值。因爲沒有來自SP的結果集,所以使用ExecuteNonQuery

var rval = new SqlParameter("@RVal", SqlDbType.NVarChar); 
rval.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(rval); 
cmd.ExecuteNonQuery(); 
result = rval.Value;