2017-09-18 178 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:除了那些评论中已经说过的东西之外,我没什么其他可以说的。 –