c# - 使用 C# Windows 窗体应用程序将数据从 Excel (.CSV) 文件上传到 SQL

标签 c# sql sql-server excel csv

我正在使用这种方法将数据上传到 SQL。

private void button5_Click(object sender, EventArgs e)
{
    string filepath = textBox2.Text;

    string connectionString_i = string.Format(@"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=YES;FMT=Delimited""", Path.GetDirectoryName(filepath));

    using (OleDbConnection connection_i = new OleDbConnection(connectionString_i))
    {
        connection_i.Open();

        OleDbCommand command = new OleDbCommand ("Select * FROM [" + Path.GetFileName(filepath) +"]", connection_i);

        command.CommandTimeout = 180;

        using (OleDbDataReader dr = command.ExecuteReader())
        {
            string sqlConnectionString = MyConString;

            using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
            {
                SqlBulkCopy bulkInsert = new SqlBulkCopy(sqlConnectionString);
                bulkInsert.BulkCopyTimeout = 180;
                bulkInsert.DestinationTableName = "Table_Name";
                bulkInsert.WriteToServer(dr);

                MessageBox.Show("Upload Successful!");
            }
        }

        connection_i.Close();
    }
}

我有一个 .CSV 格式的 Excel 工作表,大约有 1,048,313 个条目。该批量复制方法仅适用于大约 36000 到 60000 个条目。我想问一下是否有任何方法可以从 Excel 中选择前 30000 个条目并将它们上传到 SQL Server 表,然后再次选择下一 block 30000 行并将它们上传到 SQL Server,依此类推直到最后一个条目已存储。

最佳答案

  1. 创建一个数据表来存储需要插入到目标表中的 csv 文件中的值。数据表中的每一列都对应于 csv 文件中的一个数据列。
  2. 在 SQL Server 上创建自定义数据类型(表值)以匹配您的数据表,包括数据类型和长度。由于这篇文章被标记为 sql-server 而不是访问,因为您的示例连接字符串似乎与此相矛盾。
  3. 使用文本阅读器和计数器变量,用 30,000 条记录填充您的数据表。
  4. 将数据表传递给您的插入查询或存储过程。参数类型为SqlDbType.Structured。
  5. 如果作业失败并且您需要重新启动,第一步可能是根据字段中的预定义键确定最后插入的值。您还可以使用左外连接作为插入查询的一部分,以仅插入表中不存在的记录。这些只是重启失败的 ETL 作业的一些更常见的技术。

与批量复制相比,此技术具有一些战术优势,因为它增加了灵 active 并且与目标表的耦合较少,因此对表的更改可能不太不稳定,具体取决于更改的性质。

关于c# - 使用 C# Windows 窗体应用程序将数据从 Excel (.CSV) 文件上传到 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42495512/

相关文章:

c# - 隐藏可扩展属性的省略号 (…) 按钮,例如属性网格中字体属性的 "…"按钮

sql - 在PL/SQL Oracle中出错

sql - 如果我在列上使用 SQLite 自动递增,它会自动维护该列的索引吗?

MySql触发器删除同一张表中的子记录

c# - Crystal Reports ReportDocument 泄漏句柄

sql-server - MS-SQL 中的“START WITH”等效表达式

c# - 使用 MSBuild 预编译 ASP.NET Web 应用程序

c# - Visual Studio 2008 表单继承和泛型加载失败

c# - WPF ListView 键盘导航问题

c# - 在 Entity Framework 查询中使用变量或常量有什么性能差异?