Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用ExecuteOnQuery调用SP_Sql Server_Vb.net_Stored Procedures_Ado.net - Fatal编程技术网

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注入漏洞,它会烧死我们!