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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huoliya12/article/details/85166740

    批量更新有两种策略:

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

第二种方式:把要更新的数据写入数据库全局临时表,然后利用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)
            {//数据批量更新出错
                
            }
        }

猜你喜欢

转载自blog.csdn.net/huoliya12/article/details/85166740