2017-06-13 94 views
1

我期望我的代碼要做的是收集SQLMigrationFl字段中具有'I'的前十條記錄,然後通過刪除'I'值來處理這十條記錄。以下是處理這個問題的部分代碼。OleDB查詢沒有返回所有結果

string inProgressQuery = "SELECT TOP 10 IDType, ID, Program, Date, Body, 
          AcctNo, ANPACAcctID, ANPACClientID, TEAMID, 
          ImportDate, AnnualReview, TeamGUID, 
          ANPACClientLastName, ANPACClientFirstName, " + 
          "PolicyNumber, AccountOwnerLastName, 
          AccountOwnerFirstName, SCRACF, SCDateTime, NoteID 
          FROM NoteTable WHERE SQLMigrationFl = ?"; 

command = new OleDbCommand(inProgressQuery, connection); 
command.Parameters.AddWithValue("SQLMigrationFl", "I"); 
reader = command.ExecuteReader(); 

if(reader.HasRows) 
{ 
    while(reader.Read()) 
    { 
     //clear the In Progress flag 
     query = "UPDATE NoteTable SET SQLMigrationFl = ? WHERE 
       NoteTable.NoteID = " + reader[19].ToString(); 

     command = new OleDbCommand(query, connection); 
     command.Parameters.AddWithValue("SQLMigrationFl", DBNull.Value); 
     reader = command.ExecuteReader(); 
    } 
} 

我在找的是查詢返回一個值並對其進行處理。然後在五秒內找到另一條記錄並重新處理該記錄。 *五秒只是我們在代碼中設置的延遲,以檢查更多待處理的記錄。它一次處理一條記錄,而不是一次抓取10條記錄,並在同一循環內同時處理這些記錄。我的代碼或查詢有問題嗎?

感謝您的幫助。

+0

您應該在使用'AddWithValue'或者完全不使用'AddWithValue'時指定類型。它可能會導致意想不到的結果。使用[OleDbType](https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbtype(v = vs.110).aspx)指定類型。 「SQLMigrationFl」也是單個值字段,或者如果「I」包含在該字段中的某處,是否意味着寫入?最後,你還可以在你的'UPDATE'語句中爲'NoteId'使用一個參數。 – Igor

+0

你能提供一個OleDbType用法的例子嗎? SQLMigrationFl是一個單值字段。 –

+0

while循環中的讀者行應該是一個command.executenonquery。() –

回答

1

罪魁禍首是您使用reader = command.ExecuteReader();重新分配數據讀取器。現在將返回1個結果,並且您的下一個循環將超過該結果。不管非SELECT查詢使用ExecuteNonQuery代替。

,你可以更新您的代碼,其它地方是「更好」是隻要你有你想要在你的SQL語句中使用值

  1. 使用的參數。
  2. 總是指定所有參數的類型。
  3. 始終將實現IDisposable的類型實例包裝在using塊中,以確保資源得到清理。

我也建議你不要共享連接實例,下面好像可能有某個靜態連接。最好不要共享一個,並在需要時創建/打開一個,然後關閉/處置它。

string inProgressQuery = "SELECT TOP 10 IDType, ID, Program, Date, Body, 
         AcctNo, ANPACAcctID, ANPACClientID, TEAMID, 
         ImportDate, AnnualReview, TeamGUID, 
         ANPACClientLastName, ANPACClientFirstName, " + 
         "PolicyNumber, AccountOwnerLastName, 
         AccountOwnerFirstName, SCRACF, SCDateTime, NoteID 
         FROM NoteTable WHERE SQLMigrationFl = ?"; 

using(var command = new OleDbCommand(inProgressQuery, connection)) 
{ 
    // I guessed on the type and length 
    command.Parameters.Add(new OleDbParameter("SQLMigrationFl", OleDbType.VarChar, 10)).Value = "I"; 
    using(var reader = command.ExecuteReader()) 
    { 
     while(reader.Read()) 
     { 
      //clear the In Progress flag 
      const string UpdateQuery = "UPDATE NoteTable SET SQLMigrationFl = ? WHERE NoteTable.NoteID = ?"; 
      using(var commandUpdate = new OleDbCommand(UpdateQuery, connection)) 
      { 
       commandUpdate.Parameters.Add(new OleDbParameter("SQLMigrationFl", OleDbType.VarChar, 10)).Value = DBNull.Value; 
       commandUpdate.Parameters.Add(new OleDbParameter("NoteId", OleDbType.Int)).Value = reader[19]; 
       commandUpdate.ExecuteNonQuery(); 
      } 
     } 
    } 
} 
+0

非常豐富。謝謝 –