2012-10-08 74 views
1

我需要一個用於將數據從XML文件傳輸到MySQL表的最快解決方案。 我有內部的多個表的XML文件,像這樣:用C#編寫MySQL到MySQL#

<?xml version="1.0" standalone="yes"?> 
<RawData xmlns=""> 
    <Table1> 
    <ID_Table1>1</ID_Table1> 
    <Name>Victor</Name> 
    </Table1> 
    <Table2> 
    <ID_Table2>1</ID_Table2> 
    <Quantity>10</Quantity> 
    </Table2> 
</RawData> 

和內VS2010,我有從MySQL數據庫的表1和表2數據表和TableAdapter的數據源。 我的目標是讀取XML文件,並直接傳遞它的數據到這些數據表與這樣的:如果數據類型不同,我得到異常 1(在數據源:

myDSDataSet eDS = (myDSDataSet)this.FindResource("myDS"); // Declared in XAML 

OpenFileDialog dlg = new OpenFileDialog(); 
dlg.Filter = "XML Files|*.xml"; 
dlg.Title = "Select a XML File"; 

Nullable<bool> result = dlg.ShowDialog(); 

if (result == true) 
{     
mt1TableAdapter mt1_TA = new mt1TableAdapter(); 
mt2TableAdapter mt2_TA = new mt2TableAdapter(); 
manager = new TableAdapterManager();  

xmlDS = new DataSet(); 
dt = null; 

try 
{      
    xmlDS.ReadXml(dlg.FileName,XmlReadMode.InferTypedSchema); 

    for (int i = 0; i < xmlDS.Tables.Count; i++) 
    {       
    dt = xmlDS.Tables[i].Copy(); 

    eDS.Tables[eDS.Tables.IndexOf(xmlDS.Tables[i].TableName)].Merge(dt);       
    } 

    mt1_TA.Update(eDS.mt1); 
    mt2_TA.Update(eDS.mt2); 

    MessageBox.Show("Loading complete."); 
} 
catch (Exception error) 
{ 
    MessageBox.Show("ERROR: " + error.Message); 
}    
} 

但執行此代碼我有2層大的問題後,字段爲日期時間,XML字段讀爲字符串) 2.調用TableAdapter.Update()需要很長時間才能將數據保存到db(15k行需要10-15分鐘)

所以......我的問題是,Can有人請幫我解決這兩個問題,或者給我一些指導,說明什麼是將XML數據保存到mysql的最快和最好的方法。

注意: - 我使用VS2010和MySQL 5.1。 - XML文件需要從外部源加載。 - XML有其xmlns,但爲簡單起見,此處省略。 - 我試着將MySQL升級到5.6並使用LOAD XML,但是我不能在存儲過程中使用這個命令。

謝謝

回答

1

好的,我已經解決了這個問題。張貼在這裏以防萬一別人遇到這個問題。以下解決方案爲表結構使用預定義模式,並使用BackGroundWorker進行數據處理。 想法是使用StringBuilder將最新讀取的數據輸入MySQL表格(生成巨大字符串的最快方式)。 StringBuilder變量取所有的sql表達式,並在DB上執行一個「go」(大大減少處理時間!)。

StringBuilder sqlCommand = new StringBuilder(); 

DataSet xmlDS = new DataSet(); 

try 
{ 
    xmlDS.ReadXmlSchema(shemaPath); 
    xmlDS.ReadXml(dlg.FileName, XmlReadMode.ReadSchema);   

    sqlCommand.Clear(); 
    sqlCommand.Append("START TRANSACTION;"); 

    for (int i = xmlDS.Tables.Count-1; i >= 0; i--) 
    { 
     if (xmlDS.Tables[i].Rows.Count > 0) 
      sqlCommand.Append("DELETE FROM " + xmlDS.Tables[i].TableName + "; "); 
    } 

    int brojacDataTable = 0;    

    foreach (DataTable dataTable in xmlDS.Tables) 
    { 
     brojacDataTable++; 
     if (dataTable.Rows.Count > 0) 
     {  
      sqlCommand.Append(" INSERT INTO " + dataTable.TableName + " VALUES"); 

      int brojacDataRows = 0; 
      foreach (DataRow dataRow in dataTable.Rows) 
      { 
      brojacDataRows++; 
      sqlCommand.Append("("); 

      for (int i = 0; i < dataRow.ItemArray.Length; i++) 
      { 
       if (!System.DBNull.Value.Equals(dataRow.ItemArray[i])) 
       { 
        if (dataRow.ItemArray[i] is System.DateTime) sqlCommand.Append("'" +((DateTime)dataRow.ItemArray[i]).ToString("yyyy-MM-dd") + "'"); 
        else sqlCommand.Append("'" + dataRow.ItemArray[i].ToString() + "'"); 
       } 
       else sqlCommand.Append("null"); 

       if (i < dataRow.ItemArray.Length - 1) sqlCommand.Append(","); 
      } 

      if (brojacDataRows < dataTable.Rows.Count) sqlCommand.Append("),"); 
      else sqlCommand.Append(");"); 
      } 
     } 
    } 

    sqlCommand.Append("COMMIT;"); 

最終,一些測試後,用於上載與200.000+記錄大約30表總時間小於20秒:d