0

我遇到了一些奇怪的事情,我不确定它为什么会这样。在 for each 循环中,我将行添加到表中以进行交叉引用。使用以下代码:

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 但这对我来说没有任何意义,因为我希望 objCommand 的 commandText 为空,因为它位于 using 块中。

4

2 回答 2

3

您的命令文本每次都是相同的。不要重建它。试试这个:

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 server 的性能,甚至破坏你的查询。
  • 这只会创建一次插入查询字符串,而不是每个检查点一次
  • 这只会创建一个 SqlCommand 对象
于 2010-03-03T15:06:27.377 回答
0

除了原始问题之外,以下行不需要在循环中

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在循环中使用相同的实例。唯一属于循环的是动态值。

于 2010-03-03T15:05:36.240 回答