Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Massenaktualisierung in C#

Ich habe zuvor eine Masseneinfügung aus den Daten in eine temporäre Tabelle durchgeführt und dann einen Befehl oder eine gespeicherte Prozedur verwendet, um die Daten in Bezug auf die temporäre Tabelle mit der Zieltabelle zu aktualisieren. Die temporäre Tabelle ist ein zusätzlicher Schritt, aber Sie können mit der Masseneinfügung und massiven Aktualisierung eine Leistungssteigerung erzielen, wenn die Anzahl der Zeilen groß ist, verglichen mit der Aktualisierung der Daten Zeile für Zeile.

Beispiel:

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();
            }
        }
    }
}

Beachten Sie, dass eine einzelne Verbindung verwendet wird, um den gesamten Vorgang auszuführen, um die temporäre Tabelle in jedem Schritt verwenden zu können, da der Geltungsbereich der temporären Tabelle pro Verbindung gilt.