2010-03-03 71 views
0

我遇到了一些奇怪的事情,我不确定它为什么会这样做。在每个循环中,我将行添加到表中以供交叉引用。使用下面的代码:SQLCommand没有清除循环中的commandtext

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是因为它空在使用块中。

+0

什么叫“被追加insertSQL”是什么意思?你可以在调试时就内容的外观来解释吗? – shahkalpesh 2010-03-03 15:02:21

回答

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对象
+0

啊,当然。无论如何,这种方式更有意义。 – 2010-03-03 15:54:15

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