代码之家  ›  专栏  ›  技术社区  ›  Maury Markowitz

使用ExecuteOnQuery调用SP

  •  0
  • Maury Markowitz  · 技术社区  · 6 年前

    我的应用程序中有一些通用代码,用于调用insert之类的非查询命令:

    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 RETURN_VALUE . 我 犯罪嫌疑人 这是因为我没有以下行:

    DBComm.CommandType = CommandType.StoredProcedure
    

    这种怀疑对吗?

    但是,如果我添加这一行,SQL就不再工作了 Could not find stored procedure "Import_Validation '1234', 'maury' DBComm

    那么,有没有一种方法可以使用我构造的SQL调用SP,并且仍然得到一个参数?

    2 回复  |  直到 6 年前
        1
  •  1
  •   TonyE    6 年前

    如果你只是返回一个整数,我用了这个:

    Param.value=cmd.ExecuteScalar() 
    
        2
  •  1
  •   iSR5    6 年前

    我无法猜测也无法解释为什么您在执行存储过程时遇到问题,因为您没有共享完整的代码(出现问题的代码的完整部分)。但是,一般来说 ExecuteNonQuery() 你应该使用一个有效的T-SQL。默认情况下,commandType是Text。因此,如果需要执行存储过程,则需要在执行查询之前将命令类型更改为StoredProcedure。所以,我认为你的猜测是正确的:

    DBComm.CommandType = CommandType.StoredProcedure
    

    另外,在您的代码中,您声明了一个@RETURN\u 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