2

我只是想知道,如何使用 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 中?谢谢。

4

3 回答 3

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
}
于 2013-10-02T09:35:50.490 回答
0

您已经完成了一半,您已从 Excel 电子表格中获取信息并将其存储在DataTable 中

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

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

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

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

有了这个,您可以将所有数据加载到类对象中,这使得在执行INSERTSQL之前验证每个对象变得更加容易。

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

祝你好运

于 2013-10-02T09:50:32.470 回答
0

这是我在从一个 SQL Server 到另一个 SQL Server 或从 DataFiles 到 SQL 的数据迁移场景中所做的:

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

锡拉克

于 2013-10-02T09:42:40.157 回答