使用Parameters.AddWithValue时未提供SqlParameter

时间:2019-12-13 17:07:18

标签: sql-server vb.net sqlcommand

这是我设置命令的方式。它以第一个参数UpdateType停止。此代码正在从VB.NET 2008版本中更新。

Dim db As New DB()
Dim cmd As SqlCommand = New SqlCommand()

'Put into an object, and use AddWithValue due to Parameters.Add being deprecated.
Dim UpdateType As String = "PARAMETERS"

If IsNewJob Then
  cmd.CommandText = "sp_MB_AddJob"
Else
  cmd.CommandText = "sp_MB_UpdateJob"
  cmd.Parameters.AddWithValue("@UpdateType", SqlDbType.NVarChar).Value = UpdateType
  cmd.Parameters.AddWithValue("@OrigJobName", OrigJobName.ToString)
End If

cmd.Parameters.AddWithValue("@UserID", CInt(Utils.GetLoggedInUserID))
cmd.Parameters.AddWithValue("@ProjectName", ProjectName.ToString)

2 个答案:

答案 0 :(得分:1)

对于类型.AddNVARCHARVARCHAR,应将VARBINARY用作类型  与长度。在这里,我展示了如何处理您在问题中遇到的问题,仅出于示例目的,我做了一些说明。使用AddWithValue可能会对SQL性能和其他方面产生负面影响。

可以在许多地方找到一些帮助您的信息,包括https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/configuring-parameters-and-parameter-data-types

Dim db As New DB()
Dim cmd As SqlCommand = New SqlCommand()
Dim UpdateType As String = "PARAMETERS"
cmd.CommandType = CommandType.StoredProcedure

If IsNewJob Then
  cmd.CommandText = "sp_MB_AddJob"
Else
  cmd.CommandText = "sp_MB_UpdateJob"
  cmd.Parameters.Add("@UpdateType", SqlDbType.NVarChar, 10).Value = UpdateType
  cmd.Parameters.Add("@OrigJobName", SqlDbType.NVarChar, 50).Value = OrigJobName.ToString
End If
cmd.Parameters.Add("@UserID", SqlDbType.Int).Value = CInt(Utils.GetLoggedInUserID)
cmd.Parameters.Add("@ProjectName", SqlDbType.NVarChar, 30).Value = ProjectName.ToString

答案 1 :(得分:0)

将数据库对象保留在使用它们的方法的本地,以便您可以控制它们的关闭和处理。 `使用...结束使用块可以帮助您解决这一问题。请注意,单个using块同时处理连接和命令。

不推荐使用.Add方法。绝对是.Add(String, Object)重载。 `.AddWithValue当然不受欢迎。参见http://www.dbdelta.com/addwithvalue-is-evil/https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ 还有一个: https://dba.stackexchange.com/questions/195937/addwithvalue-performance-and-plan-cache-implications 这是另一个 https://andrevdm.blogspot.com/2010/12/parameterised-queriesdont-use.html

我不得不猜测参数的数据类型和列大小。检查数据库中的实际值,并相应地更正代码。

Private Sub OpCode()
    Dim UpdateType As String = "PARAMETERS"
    Using cn As New SqlConnection("Your connection string"),
            cmd As New SqlCommand()
        cmd.Connection = cn
        If IsNewJob Then
            cmd.CommandText = "sp_MB_AddJob"
        Else
            cmd.CommandText = "sp_MB_UpdateJob"
            cmd.Parameters.Add("@UpdateType", SqlDbType.NVarChar, 50).Value = UpdateType
            cmd.Parameters.Add("@OrigJobName", SqlDbType.NVarChar, 200).Value = OrigJobName.ToString
        End If

        cmd.Parameters.Add("@UserID", SqlDbType.Int).Value = CInt(Utils.GetLoggedInUserID)
        cmd.Parameters.Add("@ProjectName", SqlDbType.NVarChar, 200).Value = ProjectName.ToString
        cn.Open()
        cmd.ExecuteNonQuery()
    End Using
End Sub