使用c#将包含大量列标题的Excel文件导入mysql

时间:2013-10-02 08:57:55

标签: c# mysql database visual-studio-2010 excel-2010

我只是想知道,如何用c#将大型excel文件导入mysql?我的编码经验不是很好,我希望是否有人可以给我一些粗略的想法开始。到目前为止,我能够使用以下代码将excel文件加载到datagridview中:

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?谢谢。

3 个答案:

答案 0 :(得分:0)

我认为你需要循环遍历数据表中的项目并对它们执行某些操作(可能是对数据库的插入语句)

喜欢这样

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
}

答案 1 :(得分:0)

这是我在从一个SQL Server到另一个SQL Server或从DataFiles到SQL的数据迁移方案中所做的事情:

  1. 在目标SQL Server上创建新表(列名,主键等)
  2. 将现有数据加载到DataTable(这就是您已经做过的事情)
  3. 现在使用DataAdapter将新表查询到另一个DataTable(与excel文件相同,但现在查询SQL表除外。)
  4. 使用DataTable方法“Load()”将OldData从'table'加载到'newTable'
  5. 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>)
    

    匹配的列将导入到新的DataTable中。 (您可以通过在select语句中使用别名来确保映射)

    将现有数据加载到新表后,您将能够使用DataAdapter将更改写回数据库。

    写回数据的示例:ConnString - DB的连接字符串, 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

答案 2 :(得分:0)

您的中途,您已从Excel电子表格中获取信息并将其存储在 DataTable 中。

在您希望将大量数据导入SQL之前,您需要做的第一件事是验证您从电子表格中读到的内容。

您有几个选项,其中一个选项与您读取数据的方式非常相似,并使用 SQLAdapter 执行 INSERT SQL数据库。在这种情况下,您真正​​需要做的就是创建一个新连接并编写 INSERT 命令。

这里有很多这样做的例子。

我将使用的另一个选项是 LINQ to CSV http://linqtocsv.codeplex.com/)。

通过这种方式,您可以将所有数据加载到类对象中,这样可以在将 INSERT 执行到 SQL 之前更轻松地验证每个对象。

如果您的经验有限,请使用SQLAdapter连接到您的数据库。

祝你好运