C#向Sqlserver批量插入数据的三种高效方法

1 下载量 108 浏览量 更新于2024-09-03 收藏 169KB PDF 举报
"本文将详细介绍C#中批量插入数据到Sqlserver的三种方法,包括SQL语句的使用和ADO.NET的实现方式。" 在C#编程中,向Sqlserver数据库批量插入数据是常见的操作,特别是在处理大量数据时,批量插入能显著提升性能。下面将分别介绍SQL语句和C# ADO.NET实现的三种方法。 首先,让我们回顾创建的测试表`Product`,其结构如下: ```sql CREATE TABLE Product ( Id UNIQUEIDENTIFIER PRIMARY KEY, Name VARCHAR(50) NOT NULL, Price DECIMAL(18,2) NOT NULL ) ``` 表`Product`使用GUID作为主键,以避免索引重建带来的性能损失。在批量插入前,可以考虑临时删除索引,插入后再重建,以进一步优化性能。 SQL批量插入的三种方式: 1. 逐条插入(不推荐) 这是最基础的方式,但效率最低,适合少量数据插入。 ```sql INSERT INTO Product (Id, Name, Price) VALUES (newid(), '牛栏1段', 160); INSERT INTO Product (Id, Name, Price) VALUES (newid(), '牛栏2段', 260); ``` 2. 多行值插入 这种方式将多条插入语句合并在一起,减少了网络往返次数,提高效率。 ```sql INSERT INTO Product (Id, Name, Price) VALUES (newid(), '牛栏1段', 160), (newid(), '牛栏2段', 260); ``` 3. UNION ALL插入 使用`UNION ALL`将多条插入语句组合成一个SELECT语句,适用于大量数据插入。 ```sql INSERT INTO Product (Id, Name, Price) SELECT NEWID(), '牛栏1段', 160 UNION ALL SELECT NEWID(), '牛栏2段', 260 ``` C# ADO.NET批量插入的三种方式: 1. 逐条插入 这是基础方法,通过循环逐条执行INSERT语句,效率较低。 ```csharp static void InsertOne() { Console.WriteLine("采用一条一条插入的方式实现"); // 使用Stopwatch测量时间,省略代码... using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); for (int i = 0; i < totalRow; i++) { SqlCommand cmd = new SqlCommand(insertSql, conn); // 执行插入,省略代码... } } } ``` 其中`insertSql`是包含INSERT语句的字符串,`connectionString`是数据库连接字符串。 2. 使用SqlCommand的参数化批量插入 参数化可以避免SQL注入,并且提高执行效率。 ```csharp static void InsertBatchWithParams() { Console.WriteLine("采用参数化批量插入的方式实现"); // 创建SqlCommand对象,设置批处理大小 SqlCommand cmd = new SqlCommand(insertSql, conn); cmd.Parameters.AddWithValue("@name", "牛栏1段"); cmd.Parameters.AddWithValue("@price", 160); cmd.CommandTimeout = 0; // 可根据需要设置超时时间 cmd.Parameters.Clear(); for (int i = 0; i < totalRow; i++) { cmd.Parameters.AddWithValue("@name", names[i]); // 假设names数组已填充 cmd.Parameters.AddWithValue("@price", prices[i]); if (i % batchSize == 0 || i == totalRow - 1) { // 每batchSize条执行一次 cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); } } } ``` 在这里,`batchSize`是批量执行的大小,可以根据数据库性能调整。 3. 使用SqlBulkCopy批量插入 `SqlBulkCopy`类专门用于高效地批量插入数据,适用于大数据量操作。 ```csharp static void InsertBulkCopy() { Console.WriteLine("采用SqlBulkCopy批量插入的方式实现"); DataTable dataTable = new DataTable("Product"); // 初始化DataTable,设置列名和类型,与数据库表结构对应 // ... using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn)) { bulkCopy.DestinationTableName = "Product"; bulkCopy.WriteToServer(dataTable); } } ``` 首先,创建一个`DataTable`对象,其结构与目标表`Product`匹配,然后填充数据,最后使用`SqlBulkCopy`将整个`DataTable`一次性写入数据库。 以上就是C#批量插入数据到Sqlserver的三种主要方法,其中,`SqlBulkCopy`通常提供最佳性能,尤其在处理大量数据时。在实际应用中,应根据数据量、网络状况和数据库配置选择合适的方法。