2010-03-03 98 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實例。循環中唯一屬於的是動態值。