SQLCommand не очищает командный текст в цикле - PullRequest
0 голосов
/ 03 марта 2010

Я столкнулся с чем-то странным, и я не совсем уверен, почему он так себя ведет. В каждом цикле я добавляю строки в таблицу для перекрестной ссылки. Используя следующий код:

For Each cp In pCheckPoints
    If cp <> String.Empty Then
        Dim insertSQL As New StringBuilder
        With insertSQL
            .Append("INSERT INTO [CheckpointMessage] ( ")
            .Append(" [MessageID] ")
            .Append(", [CheckPoint] ")
            .Append(" ) VALUES ( ")
            .Append(" @MessageID ")
            .Append(", @Checkpoint ")
            .Append(" ) ")
        End With
        Using objCommand As New SqlCommand(insertSQL.ToString, MySQLConnection)
            With objCommand.Parameters
                .AddWithValue("@MessageID", pMessageID)
                .AddWithValue("@Checkpoint", cp)
            End With
            objCommand.ExecuteNonQuery()
            objCommand.CommandText = String.Empty
        End Using
    End If
Next

Без строки objCommand.CommandText = String.Empty CommandText добавляет insertSQL, но для меня это не имеет никакого смысла, поскольку я ожидаю, что commandText objCommand будет пустым, поскольку он находится в блоке using.

Ответы [ 2 ]

3 голосов
/ 03 марта 2010

Текст вашей команды всегда один и тот же. Не перестраивай это. Попробуйте это:

Dim insertSql As String = _
    "INSERT INTO [CheckpointMessage] " & _
        "([MessageID], [CheckPoint]) " & _
        "VALUES " & _
        "(@MessageID, @ChceckPoint)"

Using cmd As New SqlCommand(insertSql, MySQLConnection)
    cmd.Parameters.Add("@MessageID", SqlDbType.Int).Value = pMessageID
    cmd.Parameters.Add("@CheckPoint", SqlDbType.NVarChar, 255) ''# I had to guess at this type

    For Each cp As String In pCheckPoints.Where(Function(c) Not String.IsNullOrEmpty(c))
        cmd.Parameters("@CheckPoint").Value = cp
        cmd.ExecuteNonQuery()
    Next cp
End Using

Это лучше по многим причинам:

  • Компилятор может оптимизировать ваши конкатенации строк, когда StringBuilder заставил его выполнить эту работу во время выполнения
  • Явно введенные параметры позволяют избежать нескольких крайних случаев, которые могут реально снизить производительность сервера sql или даже нарушить ваш запрос.
  • Это создает только строку запроса вставки один раз , а не один раз для контрольной точки
  • Это создает только один объект SqlCommand
0 голосов
/ 03 марта 2010

За исключением исходного вопроса, следующие строки не обязательно должны быть в цикле

Dim insertSQL As New StringBuilder

        With insertSQL
            .Append("INSERT INTO [CheckpointMessage] ( ")
            .Append(" [MessageID] ")
            .Append(", [CheckPoint] ")
            .Append(" ) VALUES ( ")
            .Append(" @MessageID ")
            .Append(", @Checkpoint ")
            .Append(" ) ")
        End With

        Using objCommand As New SqlCommand(insertSQL.ToString, MySQLConnection)

Вы можете использовать строку один раз для создания команды с параметризованным запросом и использовать тот же экземпляр objCommand в цикле. Единственное, что принадлежит в цикле - это динамические значения.

...