2013-10-02 20 views
2

我只是想知道,我如何導入大型Excel文件到MySQL與C#?我的編碼經驗並不好,我希望如果有人能夠給我一些粗略的想法來開始。到目前爲止,我能到Excel文件加載到datagridview的用以下代碼:導入帶有大量列標題的Excel文件到C#與MySQL#

string PathConn = " Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + pathTextBox.Text + ";Extended Properties =\"Excel 8.0;HDR=Yes;\";"; 
OleDbConnection conn = new OleDbConnection(PathConn); 
conn.Open(); 
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter("Select * from [" + loadTextBox.Text + "$]", conn); 
table = new DataTable();    

myDataAdapter.Fill(table);  

但在那之後,我不知道我怎麼能提取信息,並將其保存到MySQL數據庫。假設我有一個空的方案創建之前,我如何工作上傳Excel文件到MySQL?謝謝。

+0

你會發現這個有用的給據你已經得到作爲獲取數據到'DataTable':http://code.google.com/p/mysqlbulkcopy/ – dash

+0

嘿,我有幾天前通過網站,但我不知道它是如何工作的,有什麼辦法可以爲我提供一些幫助? – user2837847

回答

0

我認爲,那麼你就需要循環的數據表中的項目,並與他們做什麼(也許一個INSERT語句到你的DB)

像這樣

foreach(DataRow dr in table.Rows) 
{ 
    string s = dr[0].ToString() // this will be the first column in the datatabl as they are zero indexed 
} 
0

這是我做的在數據遷移方案從一個SQL Server的另一個或數據文件到SQL:

  1. 創建目標SQL Server上的新表(列名,主鍵等)
  2. 加載現有數據到一個DataTable(那你做了什麼的話)
  3. 現在查詢新表與DataAdapter的到另一個數據表(同你除了你現在查詢SQL表Excel文件一樣。)
  4. 從 '表' 加載到OLDDATA 'newtable的' 使用數據表法 「的load()」
string PathConn = (MYSQL Connection String goes here) 
OleDbConnection conn = new OleDbConnection(PathConn); 
conn.Open(); 
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter("Select * from [" + loadTextBox.Text + "$]", conn); 
newTable = new DataTable();    

myDataAdapter.Fill(newTable); 

Now use the Load() Method on the new table: 

newTable.Load(table.CreateDataReader(), <Specify LoadOption here>) 

匹配的列將被導入的新數據表。 (您可以通過在選擇語句中使用別名來確保映射)

將現有數據加載到新表後,您將能夠使用DataAdapter將更改寫回數據庫。

示例數據寫回:CONNSTRING - 爲數據庫連接字符串, SelectStmt(可以使用相同的,你之前做了空表),並提供newtable的作爲dtToWrite

public static void writeDataTableToServer(string ConnString, string selectStmt, DataTable dtToWrite) 
    { 
     using (OdbcConnection odbcConn = new OdbcConnection(ConnString)) 
     { 
      odbcConn.Open(); 

      using (OdbcTransaction trans = odbcConn.BeginTransaction()) 
      { 
       using (OdbcDataAdapter daTmp = new OdbcDataAdapter(selectStmt, ConnString)) 
       { 
        using (OdbcCommandBuilder cb = new OdbcCommandBuilder(daTmp)) 
        { 

         try 
         { 
          cb.ConflictOption = ConflictOption.OverwriteChanges; 
          daTmp.UpdateBatchSize = 5000; 
          daTmp.SelectCommand.Transaction = trans; 
          daTmp.SelectCommand.CommandTimeout = 120; 
          daTmp.InsertCommand = cb.GetInsertCommand(); 
          daTmp.InsertCommand.Transaction = trans; 
          daTmp.InsertCommand.CommandTimeout = 120; 
          daTmp.UpdateCommand = cb.GetUpdateCommand(); 
          daTmp.UpdateCommand.Transaction = trans; 
          daTmp.UpdateCommand.CommandTimeout = 120; 
          daTmp.DeleteCommand = cb.GetDeleteCommand(); 
          daTmp.DeleteCommand.Transaction = trans; 
          daTmp.DeleteCommand.CommandTimeout = 120; 
          daTmp.Update(dtToWrite); 
          trans.Commit(); 
         } 
         catch (OdbcException ex) 
         { 
          trans.Rollback(); 
          throw ex; 
         } 

        } 
       } 
      } 
      odbcConn.Close(); 
     } 
    } 

希望這有助於。

newTable上的主鍵是必需的,否則你可能會得到一個CommandBuilder異常。

BR

Therak

+0

對不起,但我沒有得到的部分<指定loadOption here>。並且上面的代碼沒有包含插入的任何行,我很抱歉,但我想我必須使用insert語句將新的信息插入到數據庫中,如果我錯了,請糾正我。謝謝。 – user2837847

+0

對不起,遲到了 - 正在度假。 <指定loadOption>必須選擇一個LoadOption。在VS中,您將看到它們將如何在LoadOption上運行。它確定如何將加載的數據插入到DataTable中(哪一行版本將被覆蓋)。關於Insert語句:如果您在數據庫上提供了主鍵信息,則ODBCCommandBuilder將爲您自動生成屬性SQL語句。希望這有助於多一點.. BR – therak

0

你的一半了,您已經獲得從Excel電子表格中的信息,並將它存儲在一個DataTable中

在查看將大量數據導入到SQL之前,您需要做的第一件事是驗證您從電子表格中讀入的內容。

您有幾種選擇,其中一個是做的非常相似,你在你的數據是如何讀,這是使用SQLAdapter執行有事INSERT到SQL數據庫。在這種情況下,您真正​​需要做的就是創建一個新連接並寫入INSERT命令。

這裏有很多這樣做的例子。

我會使用的另一個選項是LINQ到CSVhttp://linqtocsv.codeplex.com/)。

有了這個,你可以將所有的數據加載到類對象這使得它更容易驗證每個對象,你執行你INSERTSQL之前。

如果您的經驗有限,請使用SQLAdapter連接到您的數據庫。

好運

+0

如果我要寫一個插入命令,那不會是一種很好的代碼方式,對不起,我之前沒有提及這個,excel文件並不總是包含相同的列標題,有時它可以填充較少的信息(列標題),有時它可以更多。所以會有不同的模式來迎合不同的信息。但是,如果我使用插入,我將不得不逐一鍵入,這不是很理想,你有其他方式讓代碼檢查自己嗎? – user2837847