我正在使用这种方法将数据上传到 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,依此类推直到最后一个条目已存储。
最佳答案
- 创建一个数据表来存储需要插入到目标表中的 csv 文件中的值。数据表中的每一列都对应于 csv 文件中的一个数据列。
- 在 SQL Server 上创建自定义数据类型(表值)以匹配您的数据表,包括数据类型和长度。由于这篇文章被标记为 sql-server 而不是访问,因为您的示例连接字符串似乎与此相矛盾。
- 使用文本阅读器和计数器变量,用 30,000 条记录填充您的数据表。
- 将数据表传递给您的插入查询或存储过程。参数类型为SqlDbType.Structured。
- 如果作业失败并且您需要重新启动,第一步可能是根据字段中的预定义键确定最后插入的值。您还可以使用左外连接作为插入查询的一部分,以仅插入表中不存在的记录。这些只是重启失败的 ETL 作业的一些更常见的技术。
与批量复制相比,此技术具有一些战术优势,因为它增加了灵 active 并且与目标表的耦合较少,因此对表的更改可能不太不稳定,具体取决于更改的性质。
关于c# - 使用 C# Windows 窗体应用程序将数据从 Excel (.CSV) 文件上传到 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42495512/