C#批量更新sql server数据库数据

    批量更新有两种策略:

第一种方式:拼接所有更新字符串,在数据库一次性执行,这样减少数据更新时频繁的连接断开数据库。

第二种方式:把要更新的数据写入数据库全局临时表,然后利用sql语句更新,最后把原表中不存在的数据获取到再批量写入。

以下是第二种方式的实现。

该方式中有投机取巧的嫌疑,但是确实能对在单机大批量更新的操作有很大帮助。

1、tableName是要更新数据库的名称。

2、dataTable是以DataTable结构的数据,和被更新的数据表结构一致。

3、IDName更新依据,即当ID或name相同时更新其余项。

4、Connection数据库连接字符串。

5、本函数有很多写的不完善的地方,可以自己修改或按照思路重写。

/// <summary>
        /// 批量更新函数
        /// </summary>
        /// <param name="tableName">被更新表表名</param>
        /// <param name="dataTable">更新数据库表新数据</param>
        /// <param name="IDName">更新依据</param>
        /// <param name="Connection">数据库连接字符串</param>
        static public void SqlBulkUpdate(string tableName, DataTable dataTable, string IDName, string Connection)
        {
            try
            {
                using (SqlConnection connection = new SqlConnection(Connection))
                {
                    try
                    {
                        connection.Open();
                        string TempTableName = String.Format("##TempTable{0}", DateTime.Today.ToString("yyyyMMddhhmmss"));
                        string temp = String.Format("select * into {0} from {1} where 1 = 2;", TempTableName, tableName);

                        SqlCommand command = new SqlCommand(temp, connection);
                        command.ExecuteNonQuery();
                        command.Dispose();

                        SqlBulkCopyByDatatable(Connection,TempTableName, dataTable);

                        StringBuilder stringBuilder = new StringBuilder();

                        stringBuilder.AppendFormat("update {0} set ", tableName);
                        for (int i = 0; i < dataTable.Columns.Count; i++)
                        {
                            stringBuilder.AppendFormat(" {0}." + dataTable.Columns[i].ColumnName + " = {1}." + dataTable.Columns[i].ColumnName + ", ", tableName, TempTableName);
                        }
                        stringBuilder.Remove(stringBuilder.Length - 2, 1);
                        stringBuilder.AppendFormat(" from {0} where {1}.{2} = {0}.{2}", TempTableName, tableName, IDName);

                        SqlCommand command2 = new SqlCommand(stringBuilder.ToString(), connection);
                        command2.ExecuteNonQuery();
                        command2.Dispose();

                        string insertStr = String.Format("select * from {0} as A where A.{2} not in (select B.{2} from {1} as B)", TempTableName, tableName, IDName);

                        DataSet insertSet = ExecDataSet(Connection,insertStr);
                        if (insertSet.Tables[0].Rows.Count > 0)
                        {
                            SqlBulkCopyByDatatable(Connection,tableName, insertSet.Tables[0]);
                        }
                        connection.Close();
                        connection.Dispose();
                    }
                    catch (Exception e)
                    {

//数据批量更新出错
                        connection.Close();
                        connection.Dispose();
                    }

                }
            }
            catch (Exception e)
            {//数据批量更新出错
                
            }
        }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C#中批量处理数据的方法: 1. 使用SqlBulkCopy类进行批量插入数据SQL Server数据库中。 ```csharp using System.Data.SqlClient; // 假设有一个DataTable对象dt,包含要插入的数据 using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection)) { bulkCopy.DestinationTableName = "dbo.MyTable"; bulkCopy.WriteToServer(dt); } } ``` 2. 使用OracleBulkCopy类进行批量插入数据到Oracle数据库中。 ```csharp using Oracle.ManagedDataAccess.Client; // 假设有一个DataTable对象dt,包含要插入的数据 using (OracleConnection connection = new OracleConnection(connectionString)) { connection.Open(); using (OracleBulkCopy bulkCopy = new OracleBulkCopy(connection)) { bulkCopy.DestinationTableName = "MyTable"; bulkCopy.WriteToServer(dt); } } ``` 3. 使用SQLiteBulkCopy类进行批量插入数据SQLite数据库中。 ```csharp using System.Data.SQLite; // 假设有一个DataTable对象dt,包含要插入的数据 using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { connection.Open(); using (SQLiteBulkCopy bulkCopy = new SQLiteBulkCopy(connection)) { bulkCopy.DestinationTableName = "MyTable"; bulkCopy.WriteToServer(dt); } } ``` 4. 使用MySqlBulkCopy类进行批量插入数据到MySQL数据库中。 ```csharp using MySql.Data.MySqlClient; // 假设有一个DataTable对象dt,含要插入的数据 using (MySqlConnection connection = new MySqlConnection(connectionString)) { connection.Open(); using (MySqlBulkCopy bulkCopy = new MySqlBulkCopy(connection)) { bulkCopy.DestinationTableName = "MyTable"; bulkCopy.WriteToServer(dt); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值