C#高效利用SqlBulkCopy导入Excel到SQLServer

4星 · 超过85%的资源 需积分: 9 1 下载量 66 浏览量 更新于2024-09-10 收藏 4KB TXT 举报
“C#高效导入Excel数据到SQL Server数据库的方法” 在C#编程中,将大量Excel数据导入到SQL Server数据库通常是一项常见的任务。传统的做法是通过循环读取Excel数据并逐条插入SQL语句,这种方法不仅耗时,而且容易出现错误。然而,通过使用`System.Data.SqlClient.SqlBulkCopy`类,可以实现快速且高效的导入,这个方法被称为BCP(Bulk Copy Program)。本篇文章将详细介绍如何在C#中利用`SqlBulkCopy`实现这一高效的数据迁移。 首先,`SqlBulkCopy`类提供了一种快速将大量数据从一个数据源(如DataTable或IDataReader)复制到SQL Server表的机制。相比于逐行插入,它显著提高了性能,尤其在处理大量数据时。在给出的代码示例中,作者展示了如何导入包含6万多条记录的Excel sheet,整个过程只需10秒左右,其中真正的数据导入时间仅需4.5秒。 以下是一个简单的C#代码示例,演示了如何使用`SqlBulkCopy`将Excel数据导入到SQL Server: ```csharp using System; using System.Data; using System.Windows.Forms; using System.Data.OleDb; using System.Data.SqlClient; namespace WindowsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // 导入Excel中的sheet1到SQL Server string connString = "server=localhost;uid=sa;pwd=sqlgis;database=master"; System.Windows.Forms.OpenFileDialog fd = new OpenFileDialog(); if (fd.ShowDialog() == DialogResult.OK) { TransferData(fd.FileName, "sheet1", connString); } } public void TransferData(string excelFile, string sheetName, string connectionString) { DataSet ds = new DataSet(); try { // 读取Excel文件 string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "DataSource=" + excelFile + ";" + "ExtendedProperties=Excel8.0;"; OleDbConnection conn = new OleDbConnection(strConn); conn.Open(); string strExcel = ""; OleDbDataAdapter myCommand = new OleDbDataAdapter("SELECT * FROM [" + sheetName + "$]", conn); myCommand.Fill(ds); // 创建SqlBulkCopy对象并设置目标表名 using (SqlConnection sqlConn = new SqlConnection(connectionString)) { sqlConn.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn)) { bulkCopy.DestinationTableName = "TargetTable"; bulkCopy.WriteToServer(ds.Tables[0]); } } } catch (Exception ex) { // 错误处理 Console.WriteLine(ex.Message); } } } } ``` 在这个示例中,当用户选择Excel文件后,程序会读取指定的sheet(例如"sheet1"),然后使用`SqlBulkCopy`将数据复制到名为"TargetTable"的SQL Server表中。`WriteToServer`方法执行实际的批量导入操作。 需要注意的是,`SqlBulkCopy`的使用要求目标数据库表结构与Excel表中的列结构匹配。如果列不匹配,可能会导致数据导入失败。此外,连接字符串应根据实际的服务器、数据库、用户名和密码进行调整。 为了确保最佳性能,以下几点建议可以参考: 1. 在导入前,预处理Excel数据,如删除不需要的行或列,避免导入大量无用数据。 2. 如果可能,关闭其他应用程序以减少系统资源的竞争。 3. 优化数据库表设计,例如使用合适的数据类型,创建索引等。 通过`SqlBulkCopy`,C#程序员可以快速地将大量Excel数据导入到SQL Server,从而提高工作效率,降低潜在的错误风险。对于需要频繁进行此类操作的项目,这是一个非常实用的工具。