在实际项目开发中,可能会在定时任务里进行批量添加的操作,或者需要写一些小工具进行批量添加测试。
此篇文章就是使用System.Data.SqlClient 进行简单批量操作。
目录
- 1、批量插入数据
- 1.1、示例代码
- 1.2、列映射
- 1.3、是否需要映射列
- 2、批量更新数据
- 3、链接字符串
- 3.1、Windows 身份验证
- 3.2、Sql Server 身份验证
1、批量插入数据
在C#中,使用System.Data.SqlClient可以进行批量操作,以提高数据库的性能和效率。
1.1、示例代码
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlTransaction transaction = connection.BeginTransaction())
{
try
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, transaction))
{
bulkCopy.DestinationTableName = "YourDestinationTableName";
bulkCopy.ColumnMappings.Add("SourceColumn1", "DestinationColumn1");
bulkCopy.ColumnMappings.Add("SourceColumn2", "DestinationColumn2");
// 添加更多的列映射
DataTable dataTable = new DataTable();
// 将数据添加到dataTable
bulkCopy.WriteToServer(dataTable);
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
Console.WriteLine("批量插入数据失败:" + ex.Message);
}
}
}
1.2、列映射
在 C# 中,bulkCopy.ColumnMappings.Add 方法用于将源表的列映射到目标表的列。它允许你指定源列和目标列之间的映射关系,以确保插入数据时正确地将源数据映射到目标表的列。
bulkCopy.ColumnMappings.Add 方法具有两个参数,分别是 sourceColumn 和 destinationColumn。
-
sourceColumn:表示源表中的列名称或索引。你可以提供源表的列名,也可以使用整数索引来指定列的位置(索引从 0 开始)。
-
destinationColumn:表示目标表中的列名称。你需要提供目标表的列名,以确保源表的数据正确地映射到目标表的列。
using System.Data.SqlClient;
// 假设你有一个名为 sourceDataTable 的 DataTable,其中包含了要插入的数据
DataTable sourceDataTable = new DataTable();
// ...
// 创建目标表的连接和剩余的代码...
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// 创建目标表的 BulkCopy 对象
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
// 设置目标表的名称
bulkCopy.DestinationTableName = "DestinationTable";
// 添加列映射关系
bulkCopy.ColumnMappings.Add("SourceColumn1", "DestinationColumn1");
bulkCopy.ColumnMappings.Add("SourceColumn2", "DestinationColumn2");
// 将源表的数据插入到目标表中
bulkCopy.WriteToServer(sourceDataTable);
}
}
在上述示例中,我们使用 bulkCopy.ColumnMappings.Add 方法指定了两个列的映射关系。SourceColumn1 映射到 DestinationColumn1,SourceColumn2 映射到 DestinationColumn2。这样在执行 bulkCopy.WriteToServer 方法时,源表的数据将正确映射到目标表的对应列。
1.3、是否需要映射列
在使用 C# 的 bulkCopy.ColumnMappings.Add 方法进行批量插入时,如果源表和目标表的列名顺序和数据类型完全一致,可以选择不显式地添加列映射关系。在这种情况下,系统会自动根据列的名称匹配进行映射。
using System.Data.SqlClient;
// 假设你有一个名为 sourceDataTable 的 DataTable,其中包含了要插入的数据
DataTable sourceDataTable = new DataTable();
// ...
// 创建目标表的连接和剩余的代码...
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// 创建目标表的 BulkCopy 对象
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
// 设置目标表的名称
bulkCopy.DestinationTableName = "DestinationTable";
// 将源表的数据插入到目标表中,目标表和源表的列名和数据类型一致,无需显式添加列映射
bulkCopy.WriteToServer(sourceDataTable);
}
}
注意,如果源表和目标表的列名或数据类型有所不同,或者需要对列进行重新排序,那么就需要使用 bulkCopy.ColumnMappings.Add 方法来显式地指定列的映射关系,以确保数据正确地插入到目标表中
2、批量更新数据
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlTransaction transaction = connection.BeginTransaction())
{
try
{
using (SqlCommand command = new SqlCommand())
{
command.Connection = connection;
command.Transaction = transaction;
command.CommandText = @"
UPDATE YourTableName
SET DestinationColumn1 = @Value1, DestinationColumn2 = @Value2
WHERE ConditionColumn = @ConditionValue";
command.Parameters.AddWithValue("@Value1", value1);
command.Parameters.AddWithValue("@Value2", value2);
command.Parameters.AddWithValue("@ConditionValue", conditionValue);
command.ExecuteNonQuery();
}
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
Console.WriteLine("批量更新数据失败:" + ex.Message);
}
}
}
注意:上述代码仅作为示例,你需要根据自己的实际情况进行适当的修改和调整。还要确保正确处理异常、事务和连接的释放,以保证数据操作的一致性和可靠性。
3、链接字符串
3.1、Windows 身份验证
不需要账号密码即可登录
在C#中,如果数据库没有启用身份验证,或者你不需要提供用户名和密码进行身份验证,你可以使用以下两种方式中的任意一种来创建连接字符串
string connectionString = @"Data Source=服务器名称;Initial Catalog=数据库名称;Integrated Security=True";
- 使用 Trusted_Connection 选项:
在这种情况下,你同样只需要提供服务器名称和数据库名称,连接字符串中的 Trusted_Connection=True 部分也表示使用 Windows 身份验证。
请注意,以上两种写法是相同的,Integrated Security=True 和 Trusted_Connection=True 是等效的。
在实际使用中,你需要将示例中的 “服务器名称” 和 “数据库名称” 替换为你实际的服务器名称和数据库名称。
这些连接字符串采用了默认的 SQL Server 端口(1433)。如果需要使用非默认端口连接数据库,可以在连接字符串中指定端口号,如:
string connectionString = @"Data Source=服务器名称,端口号;Initial Catalog=数据库名称;Integrated Security=True";
确保替换 “服务器名称”、“数据库名称” 和 “端口号” 为实际的值。
3.2、Sql Server 身份验证
需要账号密码即可登录
- 默认方式
如果你需要提供用户名和密码进行身份验证来连接数据库,你可以使用以下方式来创建连接字符串:
请将以上连接字符串中的 “服务器名称”、“数据库名称”、“用户名” 和 “密码” 替换为你实际使用的值。
这里的 “User ID” 表示用户名,“Password” 表示密码。通过提供这两个参数,你可以使用提供的凭据来进行身份验证,以访问数据库。确保用户名和密码与你的实际数据库凭据匹配。
string connectionString = @"Data Source=服务器名称;Initial Catalog=数据库名称;User ID=用户名;Password=密码;";
- 超时设置方式
此外,你还可以添加其他的连接参数,如加密选项、连接超时等,具体根据你数据库服务提供商的要求进行设置。
以下是一个示例连接字符串,添加了一些常见的额外连接参数:
string connectionString = @"Data Source=服务器名称;Initial Catalog=数据库名称;User ID=用户名;Password=密码;Encrypt=True;Connection Timeout=30;";
在上述示例中,我们添加了两个额外的连接参数:将 “Encrypt=True” 设置为启用加密选项,将 “Connection Timeout=30” 设置为连接超时时间为30秒。你可以根据实际需求添加或修改其他连接参数。
请注意,数据库服务提供商和版本的不同可能需要稍微调整连接字符串的写法。因此,建议查阅相关数据库的文档以获取更准确的连接字符串格式。