使用C#windows form app从Excel(.CSV)文件上载数据到SQL

时间:2017-02-27 20:50:07

标签: 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表,然后再次选择30000行的下一个块并将其上传到SQL Server,依此类推,直到最后一个条目已存储。

1 个答案:

答案 0 :(得分:1)

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