2016-07-06 10 views
3

私はCSVへの通知を送信するための多数の予定を処理しています。私がしたいことは、isProcessedフラグを設定して、現在の行がすでに処理されていることを確認できません。それは私の現在のループです。バッチをCSVにエクスポート

public void DumpTableToFile(SqlConnection connection, string tableName, string destinationFile) 
    { 
     using (var command = new SqlCommand("select LineType,CustomerFirstName AS 'Forename' ,CustomerLastName,Age,dob as 'Date of Birth',maritalStatus AS 'Marital Status',homePhone AS 'Home', mobileNumber AS Mobile,emailAddress AS Email,Address1 + Address2 + PostCode AS 'Address' ,employmentStatus AS Employment,occupation AS Occupation,propertyValue AS 'Property Value',mortgageBalance AS 'Mortgage Balance',balanceOnSecuredDebt AS 'Balance on secured Debt',mortgageType as 'Mortgage Type' from " + tableName, connection)) 
     using (var reader = command.ExecuteReader()) 
     using (var outFile = File.CreateText(destinationFile)) 
     { 
      string[] columnNames = GetColumnNames(reader).ToArray(); 
      int numFields = columnNames.Length; 
      outFile.WriteLine(string.Join(",", columnNames)); 
      if (reader.HasRows) 
      { 
       while (reader.Read()) 
       { 
        string[] columnValues = 
         Enumerable.Range(0, numFields) 
            .Select(i => reader.GetValue(i).ToString()) 
            .Select(field => string.Concat("\"", field.Replace("\"", "\"\""), "\"")) 
            .ToArray(); 

        outFile.WriteLine(string.Join(",", columnValues)); 
       } 
      } 
     } 

フラグがisProcessedと呼ばれ、私はそのは、CSVエクスポートを経た後trueに設定します。これはバッチ処理のエクスポートを行うことができるためです。これは、同じテーブルの予定

編集内に存在する1

申し訳ありませんが、私は、このフラグを望む午前、それはCSVファイルをエクスポートするCSVに吐き出している海流レコードの予定表に書き戻すことを述べないために輸出の仕事私は輸出されているので、2度目の処理をしないことを確認する方法が必要です。

+0

あなたはこのフラグがやって何をしたいですか?あなたが書き出すファイルの一部になっていますか?メモリ内の状態? @EricJ。 –

+0

そこに編集を行って、自分自身を説明してください編集1 – rogue39nin

+0

ありがとうございました。投票のためにありがとうございました – rogue39nin

答えて

2

次の手順を実行します。

  1. はあなたのクエリにクリテリウムを追加:WHERE NOT isProcessed、エクスポートを行う横ので、処理されていないレコードだけが処理されます。
  2. エクスポートが完了したら、このコマンドをデータベース"UPDATE " + tableName + " SET isProcessed=true WHERE <exact same criteria as the select statement>"に送信します。このようにして、すべてのレコードが処理済としてマークされます。
  3. TransactionScope arroundエクスポートメカニズムをラップします。更新。このようにして、何かが失敗した場合、操作全体がロールバックされます。
  4. TransactionScopeにtry-catchをラップすると、エクスポートが失敗するとCSVファイルが削除されるため、エクスポートされたバッチの半分が決して失われません。

あなたのコードは、この(私はそれをテストしていない)のようなものになるだろう:

public void DumpTableToFile(SqlConnection connection, string tableName, string destinationFile) 
{ 
    try 
    { 
     using(var transaction = new TransactionScope()) 
     { 
      // Select all non-processed records. 
      using (var command = new SqlCommand("select LineType,CustomerFirstName AS 'Forename' ,CustomerLastName,Age,dob as 'Date of Birth',maritalStatus AS 'Marital Status',homePhone AS 'Home', mobileNumber AS Mobile,emailAddress AS Email,Address1 + Address2 + PostCode AS 'Address' ,employmentStatus AS Employment,occupation AS Occupation,propertyValue AS 'Property Value',mortgageBalance AS 'Mortgage Balance',balanceOnSecuredDebt AS 'Balance on secured Debt',mortgageType as 'Mortgage Type' from " + tableName 
       + " WHERE NOT isProcessed", connection)) 
      using(var reader = command.ExecuteReader()) 
      using(var outFile = File.CreateText(destinationFile)) 
      { 
       string[] columnNames = GetColumnNames(reader).ToArray(); 
       int numFields = columnNames.Length; 
       outFile.WriteLine(string.Join(",", columnNames)); 
       if (reader.HasRows) 
       { 
        while(reader.Read()) 
        { 
         string[] columnValues = 
          Enumerable.Range(0, numFields) 
           .Select(i => reader.GetValue(i).ToString()) 
           .Select(field => string.Concat("\"", field.Replace("\"", "\"\""), "\"")) 
           .ToArray(); 

         outFile.WriteLine(string.Join(",", columnValues)); 
        } 
       } 
      } 

      // Update the same records that were just exported. 
      using (var command = new SqlCommand("UPDATE " + tableName + " SET isProcessed=true WHERE NOT isProcessed", connection)) 
       command.ExecuteNonQuery(); 

      transaction.Complete(); 
     } 
    } 
    catch 
    { 
     // If something went wrong, delete the export file. 
     File.Delete(destinationFile); 
     throw; 
    } 
} 
+0

こんにちは、どこからTransactionScopeが来たのですか?それは私にとって決して解決しない – rogue39nin

+0

あなたはSystem.Transactions.dllへの参照を作成しています。 –

+0

これは良い答えですが、ユーザが(OPのコードと同様に) 'tableName'の内容に影響を与えることができれば、SQLインジェクション攻撃に対して脆弱です。 @davidは不可能であることを確認してください。ユーザー入力を使用してクエリを作成する場合は、必ずパラメータ化されたクエリを使用してください。 –

関連する問題