2013-01-03 47 views
0

我有一個包含大約21個lac條目的文本文件,我想將所有這些條目插入表中。最初,我在c#中創建了一個函數,它可以一行一行地讀取並插入到表格中,但它需要很長時間。請建議插入這些批量數據的有效方法,並且該文件包含TAB(4個空格)作爲分隔符。
而且該文本文件也包含一些重複的條目,我不想插入這些條目。在MS SQL中從文本文件批量插入

+0

嘗試從表格中刪除約束並刪除索引。你可能也想看看BULK INSERT的sql語句。 – Eugene

+0

該文本文件有一些重複的條目,我不想插入這些條目。 –

回答

3

加載所有的數據到一個DataTable對象,然後使用SqlBulkCopy批量插入它們:

DataTable dtData = new DataTable("Data"); 

// load your data here 

using (SqlConnection dbConn = new SqlConnection("db conn string")) 
{ 
    dbConn.Open(); 

    using (SqlTransaction dbTrans = dbConn.BeginTransaction()) 
    { 
     try 
     { 
      using (SqlBulkCopy dbBulkCopy = new SqlBulkCopy(dbConn, SqlBulkCopyOptions.Default, dbTrans)) 
      { 
       dbBulkCopy.DestinationTableName = "intended SQL table name"; 
       dbBulkCopy.WriteToServer(dtData); 
      } 

      dbTrans.Commit(); 
     } 
     catch 
     { 
      dbTrans.Rollback(); 
      throw; 
     } 
    } 

    dbConn.Close(); 
} 

我已經包括了包裝成SqlTransaction這個例子中這樣就會有一個完整的回滾,如果有一路上失敗。爲了讓您開始,here's a good CodeProject article將分隔數據加載到DataSet對象中。加載

確定之前

消毒的數據,這裏就是我想你的數據看起來:

CC_FIPS FULL_NAME_ND 
AN   Xixerella 
AN   Vila 
AN   Sornas 
AN   Soldeu 
AN   Sispony 
... (cut down for brevity) 

您要創建DataTable像這樣的這種情況:

DataTable dtData = new DataTable("Data"); 
dtData.Columns.Add("CC_FIPS"); 
dtData.Columns.Add("FULL_NAME_ND"); 

然後你想迭代每一行(假設你的製表符分隔的數據是由回車逐行分隔的rns),並使用.Select方法檢查這個數據是否已經存在於DataTable中,如果匹配(我正在檢查兩個值,這取決於你是否想要做其他事情),那麼不要添加它防止重複。

using (FileStream fs = new FileStream("path to your file", FileMode.Open, FileAccess.Read)) 
{ 
    int rowIndex = 0; 
    using (StreamReader sr = new StreamReader(fs)) 
    { 
     string line = string.Empty; 
     while (!sr.EndOfStream) 
     { 
      line = sr.ReadLine(); 

      // use a row index to skip the header row as you don't want to insert CC_FIPS and FULL_NAME_ND 
      if (rowIndex > 0) 
      { 
       // split your data up into a 2-d array tab delimited 
       string[] parts = line.Split('\t'); 

       // now check whether this data has already been added to the datatable 
       DataRow[] rows = dtData.Select("CC_FIPS = '" + parts[0] + "' and FULL_NAME_ND = '" + parts[1] + "'"); 
       if (rows.Length == 0) 
       { 
        // if there're no rows, then the data doesn't exist so add it 
        DataRow nr = dtData.NewRow(); 
        nr["CC_FIPS"] = parts[0]; 
        nr["FULL_NAME_ND"] = parts[1]; 
        dtData.Rows.Add(nr); 
       } 
      } 

      rowIndex++; 
     } 
    } 
} 

在本月底,你應該有一個消毒DataTable,你可以批量插入。請注意,這段代碼沒有經過測試,但是對於你應該怎麼做這是一個最好的猜測。有很多方法可以完成,並且可能比這個方法(特別是LINQ)好很多 - 但這是一個起點。

+0

該文本文件有一些重複的條目,我不想插入這些條目。那麼我怎麼能忽略這些條目呢? –

+1

@PuneetPurohit你需要清理你的數據(最好)在加載到'DataTable'之前。有很多方法可以做到這一點。就我個人而言,我會從現有數據創建一個派生的,清理過的集合,並將派生集合加載到'DataTable'中。我們可以看到您的數據樣本嗎? –

+0

CC_FIPS \t FULL_NAME_ND AN \t Xixerella AN \t維拉 AN \t Sornas AN \t索爾德 AN \t Sispony的 AN \t Segudet AN \t埃爾塔特 AN \t聖利亞洛里亞 AN \t聖瓊德卡塞列斯 AN \t聖科洛馬 \t Ransol AN AN AN \t普拉茨 \t帕斯底拉卡薩 \t帕爾 AN AN AN 奧爾迪諾\t \t \t Molleres Nagol AN AN AN \t \t裏克斯爾 Ribafeta 馬斯馬斯Alins的 \t AN AN AN Llumeneres \t \t –