Sql server 使用ExecuteOnQuery调用SP
我的应用程序中有一些通用代码,用于调用插入等非查询命令:Sql server 使用ExecuteOnQuery调用SP,sql-server,vb.net,stored-procedures,ado.net,Sql Server,Vb.net,Stored Procedures,Ado.net,我的应用程序中有一些通用代码,用于调用插入等非查询命令: DBComm.CommandText = SQL DBComm.Connection = Cnn Ans = DBComm.ExecuteNonQuery 我用它来调用一个SP,它接受两个字符串并返回一个int: Dim SQL As String = "EXEC Import_Validation " & Code & "," & User Return DbS.Execute(SQL) 这可以正常工作,但返
DBComm.CommandText = SQL
DBComm.Connection = Cnn
Ans = DBComm.ExecuteNonQuery
我用它来调用一个SP,它接受两个字符串并返回一个int:
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
这将运行,但对于返回值
,始终返回0。我怀疑这是因为我没有以下行:
DBComm.CommandType = CommandType.StoredProcedure
这种怀疑正确吗
但是,如果我添加这一行,SQL将不再工作,因为无法找到存储过程“导入验证”1234、“maury”
。我假设这是因为它认为我传入的字符串只是名称,并且被参数弄糊涂了。我可以将这些参数作为输入参数添加到DBComm
上,但该方法将特定于特定的SP
那么,有没有一种方法可以使用我构造的SQL调用SP,但仍然可以获取参数?我无法猜测也无法解释您执行存储过程时遇到问题的原因,因为您没有共享完整的代码(出现问题的代码的完整部分)。但是,一般来说,当您使用
ExecuteNonQuery()
时,应该使用有效的T-SQL。默认情况下,命令类型为文本。因此,如果需要执行存储过程,则需要在执行查询之前将命令类型更改为StoredProcedure。所以,我想说你的猜测在这一行是正确的:
DBComm.CommandType = CommandType.StoredProcedure
另外,在您的代码中,您声明了一个@RETURN_VALUE参数,但我看不到任何调用其值的内容!?那么,也许这就是问题所在
无论如何,请检查以下内容:
Using connection As New SqlConnection(ConnectionString)
command As New SqlCommand("dbo.Import_Validation", connection)
command.CommandType = CommandType.StoredProcedure
command.Parameters.Add("@Code", SqlDbType.VarChar, 250)
command.Parameters.Add("@User", SqlDbType.VarChar, 250)
command.Parameters.Add("@RETURN_VALUE", SqlDbType.Int).Direction = ParameterDirection.ReturnValue
command.Parameters("@Code").Value = Code
command.Parameters("@User").Value = User
connection.Open()
command.ExecuteNonQuery()
'IF returned value is more than one row, then use reader instead
Dim return_value As Integer = Convert.ToInt32(command.Parameters("@RETURN_VALUE").Value)
connection.Close()
End Using
我无法猜测也无法解释为什么您在执行存储过程时遇到问题,因为您没有共享完整的代码(出现问题的代码的完整部分)。但是,一般来说,当您使用
ExecuteNonQuery()
时,应该使用有效的T-SQL。默认情况下,命令类型为文本。因此,如果需要执行存储过程,则需要在执行查询之前将命令类型更改为StoredProcedure。所以,我想说你的猜测在这一行是正确的:
DBComm.CommandType = CommandType.StoredProcedure
另外,在您的代码中,您声明了一个@RETURN_VALUE参数,但我看不到任何调用其值的内容!?那么,也许这就是问题所在
无论如何,请检查以下内容:
Using connection As New SqlConnection(ConnectionString)
command As New SqlCommand("dbo.Import_Validation", connection)
command.CommandType = CommandType.StoredProcedure
command.Parameters.Add("@Code", SqlDbType.VarChar, 250)
command.Parameters.Add("@User", SqlDbType.VarChar, 250)
command.Parameters.Add("@RETURN_VALUE", SqlDbType.Int).Direction = ParameterDirection.ReturnValue
command.Parameters("@Code").Value = Code
command.Parameters("@User").Value = User
connection.Open()
command.ExecuteNonQuery()
'IF returned value is more than one row, then use reader instead
Dim return_value As Integer = Convert.ToInt32(command.Parameters("@RETURN_VALUE").Value)
connection.Close()
End Using
如果您只是返回一个整数,我使用了以下方法:
Param.value=cmd.ExecuteScalar()
如果您只是返回一个整数,我使用了以下方法:
Param.value=cmd.ExecuteScalar()
最好的方法是将命令文本设置为过程名(因此没有exec)&通过parameters.add而不是字符串连接添加参数。这修复了SQL注入漏洞&返回值问题。确实如此,但现在所讨论的代码只能用于具有给定签名的单个SP。有没有办法写一个泛型版本?ExecuteOnQuery只返回修改过的行。如果是整数,可以试试Param.value=cmd.ExecuteScalar()Gah,sql注入漏洞,它会烧死我们!最好的方法是将命令文本设置为过程名(因此没有exec)&通过parameters.add而不是字符串连接添加参数。这修复了SQL注入漏洞&返回值问题。确实如此,但现在所讨论的代码只能用于具有给定签名的单个SP。有没有办法写一个泛型版本?ExecuteOnQuery只返回修改过的行。如果是整数,可以试试Param.value=cmd.ExecuteScalar()Gah,sql注入漏洞,它会烧死我们!