【发布时间】:2018-10-04 16:04:17
【问题描述】:
我的应用中有一些通用代码用于调用插入等非查询命令:
DBComm.CommandText = SQL
DBComm.Connection = Cnn
Ans = DBComm.ExecuteNonQuery
我正在使用它来调用一个接收两个字符串并返回一个 int 的 SP:
Dim SQL As String = "EXEC Import_Validation " & Code & "," & User
Return DbS.Execute(SQL)
这很好用,除了返回值不是 SP 的值(它是某种作业 ID 吗?)。所以我稍微修改了一下:
Param = New SqlParameter("@RETURN_VALUE", SqlDbType.Int)
Param.Direction = ParameterDirection.ReturnValue
DBComm.Parameters.Add(Param)
DBComm.CommandText = SQL
DBComm.Connection = Cnn
DBComm.ExecuteNonQuery
这会运行,但对于 RETURN_VALUE 总是返回 0。我怀疑这是因为我没有以下行:
DBComm.CommandType = CommandType.StoredProcedure
这种怀疑正确吗?
但是,如果我添加此行,SQL 将不再工作,抱怨 Could not find stored procedure "Import_Validation '1234', 'maury'。我认为这是因为它认为我传入的字符串只是名称,并且被参数混淆了。我可以将参数添加为DBComm 上的输入参数,但是该方法将特定于特定的SP。
那么有没有一种方法可以让我使用我构造的 SQL 调用 SP 并仍然返回一个参数?
【问题讨论】:
-
最好的办法是将命令文本设置为仅过程名称(因此没有 exec)并通过 Parameters.Add 而不是字符串连接添加参数。这修复了您的 SQL 注入漏洞和返回值问题。
-
确实如此,但现在有问题的代码只能用于具有给定签名的单个 SP。有没有办法写一个通用的版本?
-
ExecuteNonQuery 只返回修改的行。
-
如果是整数,可以试试 Param.value=cmd.ExecuteScalar()
-
呸,sql注入孔,烧死我们了!
标签: sql-server vb.net stored-procedures ado.net