sql >> Base de Datos >  >> RDS >> Sqlserver

Actualización masiva en C#

Lo que he hecho antes es realizar una inserción masiva de los datos en una tabla temporal y luego usar un comando o procedimiento almacenado para actualizar los datos que relacionan la tabla temporal con la tabla de destino. La tabla temporal es un paso adicional, pero puede obtener una mejora en el rendimiento con la inserción masiva y la actualización masiva si la cantidad de filas es grande, en comparación con la actualización de los datos fila por fila.

Ejemplo:

public static void UpdateData<T>(List<T> list,string TableName)
{
    DataTable dt = new DataTable("MyTable");
    dt = ConvertToDataTable(list);

    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["SchoolSoulDataEntitiesForReport"].ConnectionString))
    {
        using (SqlCommand command = new SqlCommand("", conn))
        {
            try
            {
                conn.Open();

                //Creating temp table on database
                command.CommandText = "CREATE TABLE #TmpTable(...)";
                command.ExecuteNonQuery();

                //Bulk insert into temp table
                using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conn))
                {
                    bulkcopy.BulkCopyTimeout = 660;
                    bulkcopy.DestinationTableName = "#TmpTable";
                    bulkcopy.WriteToServer(dt);
                    bulkcopy.Close();
                }

                // Updating destination table, and dropping temp table
                command.CommandTimeout = 300;
                command.CommandText = "UPDATE T SET ... FROM " + TableName + " T INNER JOIN #TmpTable Temp ON ...; DROP TABLE #TmpTable;";
                command.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                // Handle exception properly
            }
            finally
            {
                conn.Close();
            }
        }
    }
}

Tenga en cuenta que se usa una sola conexión para realizar toda la operación, para poder usar la tabla temporal en cada paso, porque el alcance de la tabla temporal es por conexión.