2012-10-04 45 views
0

我需要一點幫助,將數據從變量,數組,列表傳輸到SQL Server。如何從數組/列表中插入多行數據到SQL Server(DataSet,DataTable)

在SQL中我還不錯,但我不熟悉DataSet,DataTable對象。

我的數據現在存儲在字符串列表(List)中。在該列表中每個字符串類似於此:

QWERTY,19920604,0.91,0.35,0.34,0.35,343840

有90多萬行這樣的,但大的進口只會發生一次。

目標數據類型的SQL Server:

BIGINT (primary key, im not inserting it, its identity(1,1)) 
VARCHAR(10), 
DATE, 
DECIMAL(10,2), 
DECIMAL(10,2), 
DECIMAL(10,2), 
DECIMAL(10,2), 
INT 
  1. 如何將這些數據到SQL Server數據類型的轉換?

  2. 如何將該數據插入到SQL Server中?另外我需要一些插入之間的進度條更新。

我能做到這一點使用舊的時尚SQL命令, 但我終於有使用的DataTable對象學習更多現代的方式,

回答

0

我shomething像這樣:

foreach (string currentrow in buffer) // List<string> buffer - contains csv data 
{ 
       // table name is Import 
       dataset.ImportRow row = dataset.Import.NewImportRow(); 
       string[] fields = new string[7]; 

       // Field names 
       // <Nm>,<Date>,<Open>,<High>,<Low>,<Close>,<Vol> 
       fields = currentrow.Split(','); 

       // ticker 
       row.Nm = fields[0]; 

       DateTime data; 
       DateTime.TryParseExact(fields[1], "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out data); 
       row.Date = data; 

       decimal open; 
       Decimal.TryParse(fields[2], out open); 
       row.Open = open; 

       decimal high; 
       Decimal.TryParse(fields[3], out high); 
       row.High = high; 

       decimal low; 
       Decimal.TryParse(fields[4], out low); 
       row.Low = low; 

       decimal close; 
       Decimal.TryParse(fields[5], out close); 
       row.Close = close; 

       int vol; 
       Int32.TryParse(fields[6], out vol); 
       row.Vol = vol; 

       dataset.Import.AddImportRow(row); 

      } 

     importTableAdapter.Update(dataset); 
     MessageBox.Show("Done"); 

它的作品,看起來優雅。我必須處理異常處理。

2

您可以使用SqlBulkCopy的,這裏有一些例子: http://msdn.microsoft.com/en-us/library/7ek5da1a.aspx

+0

出於教育目的,我傾向於通過DataTable對象手動執行此操作。 – Kamil

+0

添加1.000.000項目時,批量插入是個好主意。 – Carra

+0

對於大型數據,bulkcopy是正確的方法。你可以使用insert來一行一行地插入,但是速度慢而且效率低。 – urlreader

0

使用ADO.NET,可能是最簡單和最失敗的安全是使用一個循環:

private void InsertList(IEnumerable<String> list) 
{ 
    String sql = "INSERT INTO dbo.Table VALUES(@varcharCol,@dateCol,@decCol1,@decCol2,@decCol3,@decCol4,@intCol);"; 
    using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString)) 
    { 
     con.Open(); 
     foreach (String str in list) 
     { 
      String[] fields = str.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 
      if (fields.Length == 7) 
      { 
       DateTime dateCol; 
       if (DateTime.TryParseExact(fields[1], "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out dateCol)) 
       { 
        decimal d1, d2, d3, d4; 
        int i1; 
        if(decimal.TryParse(fields[2], out d1) 
         && decimal.TryParse(fields[3], out d2) 
         && decimal.TryParse(fields[4], out d3) 
         && decimal.TryParse(fields[5], out d4) 
         && int.TryParse(fields[6], out i1)) 
        { 
         using(var cmd = new SqlCommand(sql, con)) 
         { 
          cmd.Parameters.AddWithValue("@varcharCol", fields[0]); 
          cmd.Parameters.AddWithValue("@dateCol", dateCol); 
          cmd.Parameters.AddWithValue("@decCol1", d1); 
          cmd.Parameters.AddWithValue("@decCol2", d2); 
          cmd.Parameters.AddWithValue("@decCol3", d3); 
          cmd.Parameters.AddWithValue("@decCol4", d4); 
          cmd.Parameters.AddWithValue("@intCol", i1); 
          int inserted = cmd.ExecuteNonQuery(); // should be 1 
         } 
        } 
       } 
      } 
     } 
    } 
} 

您應該添加記錄(解析問題)和異常處理(連接問題)。

此方法還可以輕鬆添加進度條。因此,您可以使用BackgroundWorker,它通過ReportProgress更新Progressbar

這裏有一個教程:http://www.dotnetperls.com/progressbar

+0

你沒有讀到最後。我不想使用sql命令。我想用DataTable,LINQ(?)學習現代化的方法。 – Kamil

+0

'DataTable' +'DataAdapter'只是上面的'InsertCommand'的一個包裝。在這種情況下,它基本上是相同的,甚至是不必要的開銷。上面的循環還可以觸發進度更改或添加日誌條目/異常處理。所以,即使列表的一部分已損壞,其餘的工作。 –

+0

順便說一句,上面的方法應該照原樣運行。 ADO.NET並沒有過時,如果你想讓所有的東西都在沒有開銷的情況下,ADO.NET仍然是個不錯的選擇。 Linq是一個查詢工具,不是一種替代方案。 –

1

我剛開始移動到實體框架,大大降低了我的代碼的複雜性。要做到這一點我通過以下步驟,使用實體框架增加了一個新的數據源:

  1. 添加一個新的數據源
  2. 在數據源配置嚮導,選擇數據庫
  3. 選擇實體數據模型
  4. 選擇生成從數據庫
  5. 創建一個新的連接
  6. 選擇你的表,然後單擊Finish

編譯您的項目,所以你的對象供您使用,那麼你的代碼中,你可以創建你的訪問通過:

var entity = new DatabaseEntity();

中的實體,你將看到一系列的表格和各種方法的使用。要執行,你可以使用LINQ像:

var order = new entity.fulfilled_shipments_data 
        { 
         addedCustomer = 0, 
         addedFulfillment = 0, 
         addedInvoice = 0, 
          ... 
        } 
entity.fulfilled_shipments_data.AddObject(order); 
entity.SaveChanges(); 

記住你的任務,現在可以有任何對象,並且還可能包括其他的方法調用(例如,price = Convert.ToDecimal(price),

+0

我在哪裏可以找到DatabaseEntity類型?我使用.net 3.5。 – Kamil

+0

按照上面的步驟1-6 –

+0

啊對不起,我錯過了。 – Kamil

相關問題