2014-10-31 59 views
0

我有一個表名稱爲ACTION_TYPE的字段。它的潛在值是「ADD」,「Change」,「DELETE」和「 - 」。我想要導出ACTION_TYPE值不是「 - 」的行。我成功地以正確的格式將表格行導出到文件,但是標題不能正常工作/正在寫入。將字符串寫入文件時導出數據庫表

基本上我想要的是通過文件中的類型分開條目。在示例中

ADD 
00   00  56    55 
00   00  59    42 
00   00  36    45 
CHANGE 
00   00  96    25 
DELETE 
00   00  76    75 
00   00  38    95 

到目前爲止,我一直沒有成功地使用ADD。另外,當我確實使用三種類型中的一種時,是否有更好的方法,而不僅僅是爲每種類型(ADD,CHANGE,DELETE)克隆進程?

using (StreamWriter writer = 
        new StreamWriter("C:\\BillingExport\\EXPORTS\\EFTHLDAY.TABLE.TYPE08.TRANSACTIONS.txt")) 
        { 
         writer.Write("ADD"); 
        } 
        string selectCommandText42 = "SELECT * FROM HOLIDAY_DATE_TABLE WHERE ACTION_TYPE = 'ADD '"; 
        using (SqlDataAdapter adapter42 = new SqlDataAdapter(selectCommandText42, connection)) 
        { 
         using (DataTable table42 = new DataTable("HOLIDAY_DATE_TABLE")) 
         { 
          adapter42.Fill(table42); 
          System.Text.StringBuilder commaDelimitedText = new System.Text.StringBuilder(); 
          //commaDelimitedText.AppendLine("col1,col2,col3"); // optional if you want column names in first row 
          foreach (DataRow row in table42.Rows) 
          { 
           string value = string.Format("{0}     {0}   {1}     {2}", row[1], row[2], row[3]); // how you format is up to you (spaces, tabs, delimiter, etc)         
           commaDelimitedText.AppendLine(value); 
          } 
            System.IO.File.WriteAllText("C:\\BillingExport\\EXPORTS\\EFTHLDAY.TABLE.TYPE08.TRANSACTIONS.txt",  commaDelimitedText.ToString());        
         } 
        } 

更新:實現下面的一些建議,我現在有下面的代碼

string selectCommandText42 = "SELECT * FROM HOLIDAY_DATE_TABLE WHERE ACTION_TYPE != '-'"; 
        using (SqlDataAdapter adapter42 = new SqlDataAdapter(selectCommandText42, connection)) 
        { 
         using (DataTable table42 = new DataTable("HOLIDAY_DATE_TABLE")) 
         { 
          adapter42.Fill(table42); 
          System.Text.StringBuilder commaDelimitedText = new System.Text.StringBuilder(); 
          //commaDelimitedText.AppendLine("col1,col2,col3"); // optional if you want column names in first row 

          foreach (DataRow row in table42.Rows) 
          { 
           string rowtype = row[4].ToString(); 
           using (StreamWriter writer = 
                   new StreamWriter("C:\\BillingExport\\EXPORTS\\EFTHLDAY.TABLE.TYPE08.TRANSACTIONS.txt")){ 
           writer.WriteLine(rowtype); 
          } 
           string value = string.Format("{0}     {0}   {1}     {2}", row[1], row[2], row[3]); // how you format is up to you (spaces, tabs, delimiter, etc)         
           commaDelimitedText.AppendLine(value); 
          } 
          System.IO.File.AppendAllText("C:\\BillingExport\\EXPORTS\\EFTHLDAY.TABLE.TYPE08.TRANSACTIONS.txt", commaDelimitedText.ToString());        
         } 
        } 

這是提供以下輸出

ADD 
00   00  96    25 
00   00  76    75 
00   00  38    95 
00   00  56    55 
00   00  59    42 
00   00  36    45 

這似乎不適用CHANGE或DELETE標題,並且也不以適當的順序列出條目(ADD條目現在位於已創建文件的底部)。

+0

更快,更容易的解決方案將使用SSIS並將查詢結果導出到CSV文件。這也將避免在寫回到磁盤之前加載內存中的所有內容 – 2014-10-31 13:49:48

回答

2

是的,有是不需要更好的辦法:

  1. 複製代碼
  2. 在集到內存整個結果拉(即在DataTable
  3. 複製整個結果在內存中重新設置,但在StringBuilder

一般概念的形式是:

  1. 查詢所有的數據,你在一個單一的希望選擇。通過使用WHERE WHERE ACTION_TYPE <> '-'

  2. 排序的子句的結果,讓你得到他們

    - 您可以通過匹配您的

    ACTION_TYPE值不是都需要做到這一點「」按照「添加」的預定順序,然後「更改」,然後「刪除」。您可以通過SqlDataReader.Read()添加一個簡單的ORDER BY ACTION_TYPE ASC

  3. 循環做到這一點,做一個「控制中斷」(我敢肯定,這個概念的推移,各種名稱)以應用新標頭如果當前行的爲ACTION_TYPE值與前一行不同。

  4. 在處理文件時將每行寫出到文件中。使用StreamWriter.WriteLine(String, Object, Object, Object)在輸出行的同時格式化它。

請注意:

  • 您可能需要我有沒有洞察到的模式,我不知道哪列是ACTION_TYPE
  • 建議調整_Reader.GetString調用的索引值明確地按名稱選擇字段,而不是使用SELECT *
  • 通過前綴字符串與@它不會在文件路徑:)

的代碼轉換爲雙反斜線轉義序列,因此沒有必要:

using System.IO; 
using System.Data.SqlClient; 

string _CurrentActionType = ""; 

SqlConnection _Connection = new SqlConnection("connection string"); 
SqlCommand _Command = new SqlCommand(
          @"SELECT * 
           FROM HOLIDAY_DATE_TABLE 
           WHERE ACTION_TYPE <> '-' 
           ORDER BY ACTION_TYPE ASC;", 
          _Connection 
         ); 
SqlDataReader _Reader = null; 

try 
{       
    _Connection.Open(); 

    _Reader = _Command.ExecuteReader(); 

    if (_Reader.HasRows()) 
    { 
     using (StreamWriter writer = 
      new StreamWriter(
       @"C:\BillingExport\EXPORTS\EFTHLDAY.TABLE.TYPE08.TRANSACTIONS.txt")) 

     { 
     while (_Reader.Read()) 
     { 
      // assuming [ACTION_TYPE] field is 5th column; adjust accordingly 
      if (_Reader.GetString(4) != _CurrentActionType) 
      { 
       _CurrentActionType = _Reader.GetString(4); 
       writer.WriteLine(_CurrentActionType); 
      } 

      writer.WriteLine(
       "{0}     {0}   {1}     {2}", 
       _Reader.GetInt32(1), _Reader.GetInt32(2), _Reader.GetInt32(3)); 
     } 
     } 
    } 
} 
finally 
{ 
    _Reader.Close(); 
    _Connection.Close(); 
} 
+0

@ bob-francis請使用評論發佈信息。消息是:我試圖實現這一點,雖然它對我有很多錯誤。我做了一些調整,現在我剩下3個錯誤,這是行[]調用的3個實例(名稱行在當前上下文中不存在)。 – 2014-10-31 14:50:30

+0

我將行[1]更改爲_Reader [1],2等。測試完成後效果良好。謝謝! – 2014-10-31 14:50:57

+0

@ bob-francis:我更新了'_reader.GetInt32()'交換'row []'的代碼。對於那個很抱歉。這些字段真的是INT值嗎?否則,可以很容易地改變'GetXXXX()'以適應適當的數據類型。 – 2014-10-31 14:52:12

0

每次你在你的循環調用File.WriteAllText時,你就覆蓋以前的變化:

創建一個新的文件,內容寫入到文件中,然後關閉該文件。

如果目標文件已經存在,它將被覆蓋。

使用File.AppendAllText相反,因爲它會覆蓋您的文件:

打開一個文件,將指定字符串的文件,然後關閉該文件。

修改後的代碼:

File.AppendAllText(@"C:\BillingExport\EXPORTS\EFTHLDAY.TABLE.TYPE08.TRANSACTIONS.txt", 
        commaDelimitedText.ToString()); 
0

您可以通過ACTION_TYPE更改查詢順序:

"SELECT * FROM HOLIDAY_DATE_TABLE WHERE ACTION_TYPE IN ('ADD ', 'DELETE ', 'Change ') ORDER BY ACTION_TYPE ASC" 

然後,在您的LOOP中應用此邏輯:

1)除非你遇到的第一個類型,並把它寫:

string rowtype = table42.Rows[0].Item("ACTION_TYPE"); 
writer.Write(rowtype); 

2)檢查類型變化時,寫它,只有當它改變:

foreach (DataRow row in table42.Rows) 
    { 
     if (row.Item("ACTION_TYPE").ToString() != rowtype) 
     { 
      commaDelimitedText.AppendLine(rowtype); 
     } 
     string value = string.Format("{0}     {0}   {1}     {2}",  row[1], row[2], row[3]); // how you format is up to you (spaces, tabs, delimiter, etc)         
     commaDelimitedText.AppendLine(value); 
    } 

3)

要寫入文件,使用File.AppendAllText:

File.AppendAllText(_YOURFILEHERE_, commaDelimitedText.ToString()); 

我寫的,但不嘗試,它可能工作