sql >> Databasteknik >  >> RDS >> Sqlserver

Massuppdatering i C#

Vad jag har gjort tidigare är att utföra en bulkinsert från data till en temporär tabell och sedan använda ett kommando eller en lagrad procedur för att uppdatera data som relaterar till den temporära tabellen med destinationstabellen. Temp-tabellen är ett extra steg, men du kan få en prestandaökning med bulkinsert och massiv uppdatering om antalet rader är stort, jämfört med att uppdatera data rad för rad.

Exempel:

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

Observera att en enda anslutning används för att utföra hela operationen, för att kunna använda temptabellen i varje steg, eftersom omfattningen av temptabellen är per anslutning.



  1. RPAD() Funktion i PostgreSQL

  2. Säkerhetskopiera/återställ SQLlite-databas till Google Drive-appmappen

  3. TO_DSINTERVAL() Funktion i Oracle

  4. Hur man lagrar data i unicode på hindi