【发布时间】:2017-09-18 19:47:34
【问题描述】:
我在 SQL Server 中有一个存储过程,它返回两个值。当使用以下 SQL 代码从 QA 调用时:
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)中,我尝试了许多不同的方法来获得结果,但都没有运气。要么我得到一个错误,说命名的参数不存在,要么它最终返回空值(一切都被编码以防止返回数据中出现 Null)
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
无论我尝试过什么代码,代码都不会按预期返回数据。 我究竟做错了什么?有人能解释一下吗?
【问题讨论】:
-
尽管使用了相当奇怪的列名,但这些“参数”实际上并不是参数。您只会得到一个正常的结果集,其中包含一行,其中包含值。您应该使用 ExecuteReader 而不是 ExecuteNonQuery(因为它实际上是一个查询;这就是
SELECT正在做的事情),然后从那里获取结果。 -
如果你检查
PramDateRet.Value和PramCOIDRet.Value会怎样 -
该过程看起来很可疑,就像它正在接收一个字符串并将其作为动态 sql 执行。这很可怕,很可能容易受到sql注入。
-
这个代码被提供了一个由存储过程验证的公司 ID。如果公司 ID 被证明是有效的 ID,则返回有效的公司 ID(可能存在大小写问题,因此是公司 ID 的正式版本)和日期(存储在其他地方,此处需要)。我会看看是否可以将其作为单个查询重新处理。
-
如果用动态 sql 验证它为时已晚。你真的在使用正确的参数。表值参数非常适合这类事情。
标签: sql-server vb.net tsql stored-procedures