2017-09-18 179 views
1

我在SQL Server中有一個返回兩個值的存儲過程。當從QA調用下面的SQL代碼:SQL Server存儲過程的返回值

exec TWEEPush_ValidateCO @CoFilter='CO IN(''1502'',''Mike'',''Clarkson'')', @TDate='09/18/`2017' 

它按預期工作通過返回兩個值:

@TempCOID @TempDate 
1502  09/10/2017 

存儲過程做了一些工作,並與這兩個值被設置爲非空結束值,與存儲過程與結局:

SELECT 
    @TempCOID AS N'@TempCOID', 
    @TempDate AS N'@TempDate' 

在VB.net(Visual Basic中,不C),我已經嘗試了許多不同的方法得到的結果,但有沒有運氣。要麼我得到一個錯誤說命名的參數不存在,或者它最終返回空值(一切都被編碼,以防止在空值返回數據)

Dim sConnectStr As String = GetSQLConnectionString() 

Try 
    Using Connection As New SqlConnection(sConnectStr) 
     Connection.Open() 

     Dim Command As New SqlCommand("dbo.TWEEPush_ValidateCO", Connection) 
     Command.CommandType = CommandType.StoredProcedure 
     Command.Parameters.AddWithValue("@CoFilter", Filter) 
     Command.Parameters.AddWithValue("@TDate", Now()) 

     Dim PramCOIDRet As New SqlParameter 
     PramCOIDRet.ParameterName = "@TempCOID" 
     PramCOIDRet.SqlDbType = SqlDbType.NVarChar 
     PramCOIDRet.Size = 30 
     PramCOIDRet.Direction = ParameterDirection.Output 

     Dim PramDateRet As New SqlParameter 
     PramDateRet.ParameterName = "@TempDate" 
     PramDateRet.SqlDbType = SqlDbType.NVarChar 
     PramDateRet.Size = 30 
     PramDateRet.Direction = ParameterDirection.Output 

     Command.Parameters.Add(PramCOIDRet) 
     Command.Parameters.Add(PramDateRet) 

     Command.ExecuteNonQuery() 

     Dim COID as string = Command.Parameters("@TempCOID").Value 
     Dim CoDate as Date = CDate(Command.Parameters("@TempDate").Value) 
    End Using 
Catch ex As Exception 
End Try 

無論什麼樣的代碼我已經試過了,代碼永遠不會按預期返回數據。 我在做什麼錯?請有人請說明一下這個問題嗎?

+2

儘管使用了相當奇怪的列名,那些「參數」實際上並不是參數。你會得到一個正常的結果集,其中有一行,其中的值。你應該使用ExecuteReader而不是ExecuteNonQuery(因爲它實際上是一個查詢;這就是'SELECT'的作用),然後從那裏獲取結果。 –

+0

如果您檢查'PramDateRet.Value'和'PramCOIDRet.Value',該怎麼辦? – JamieD77

+1

該過程看起來像它正在接收一個字符串並將其作爲動態sql執行。這是非常可怕的,很可能容易受到sql注入的影響。 –

回答

1

你沒告訴我們您的存儲過程的代碼 - 但最有可能的,這件事情是這樣的:

CREATE PROCEDURE dbo.dbo.TWEEPush_ValidateCO 
    @CoFilter VARCHAR(100), -- just guessing here! 
    @TDate DATE    -- again - just guessing 
AS 
BEGIN 
    DECLARE @TempCOID INT; 
    DECLARE @TempDate DATE; 

    -- do some calculations here that define @TempCOID and @TempDate 
    -- this is just for demo purposes - I'm sure your calculation is a bit 
    -- more complex and involved... 
    SET @TempCOID = 1502; 
    SET @TempDate = '20170910'; 

    -- return the values in a SELECT statement 
    SELECT 
     @TempCOID AS N'@TempCOID', 
     @TempDate AS N'@TempDate' 
END 

在這種情況下,你返回結果集 - 不是兩個參數!

你需要讓你這樣的價值觀:

static void Main(string[] args) 
{ 
    string connectionString = ConfigurationManager.ConnectionStrings["YourConnectionString"].ConnectionString; 

    int tempCoid; 
    DateTime tempDate; 

    using (SqlConnection conn = new SqlConnection(connectionString)) 
    using (SqlCommand cmd = new SqlCommand("dbo.dbo.TWEEPush_ValidateCO", conn)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 

     cmd.Parameters.AddWithValue("@CoFilter", Filter); 
     cmd.Parameters.AddWithValue("@TDate", DateTime.Now); 

     conn.Open(); 

     using (var rdr = cmd.ExecuteReader()) 
     { 
      while (rdr.Read()) 
      { 
       tempCoid = rdr.GetFieldValue<int>(0); 
       tempDate = rdr.GetFieldValue<DateTime>(1); 
      } 
     } 

     conn.Close(); 
    } 
} 

(我敢肯定你的想法 - 你可以很容易地轉化爲VB.NET這一點,太)。

希望有幫助!

Marc

+0

Marc;這與代碼和SQL過程中的內容非常接近。可悲的是,我仍然沒有獲得價值。今天我還沒有時間來解決最可能是我的編碼錯誤的問題(即不是你的例子)。在任何情況下,從SP返回的值永遠不會爲空。它們可以是空的,但不能爲空。 –

+0

@marc_s,對不起在這裏提出以下問題。我不知道如何處理這種情況。請看看。 https://stackoverflow.com/questions/46285924/which-kind-of-table-design-best-suitable-for-normalization-in-sql-server。請給我解決方案。 – RGS

+1

@RGS:除了那些評論中已經說過的東西之外,我沒什麼其他可以說的。 –