簡體   English   中英

批量插入SQL Server 2012數據庫-C#

[英]Bulk insert into the SQL Server 2012 database - C#

我在列表中有大約一百萬條記錄。 在列表中的foreach中,我查詢數據庫以獲取基於id的修改日期。 一旦獲得它,就可以測試是否可以插入或更新它..但是有什么方法可以批量(一次或成批)插入或更新。

foreach (No_kemi no_list in newforSQL)
{
    DateTime eModifiedDate = no_list.ModifiedDate.Value;
    string Id = no_list.ID.ToString();

    String selectQuery = "SELECT ModifiedDate FROM NO_table WHERE ID = '" + Id + "'";
    DateTime? dbmoddate = null;

    using (SqlCommand selectCommand = new SqlCommand(selectQuery, connection))
    {
        // Use the above SqlCommand object to create a SqlDataReader object.
        using (SqlDataReader rdr = selectCommand.ExecuteReader())
        {
            while (rdr.Read())
            {
                dbmoddate = (DateTime)rdr["ModifiedDate"];
            }
        }
    }

    string eType = null;
    string SubGUID = null;
    string trimSubKey = no_list.SubscriberKey;

    try
    {
        if ((trimSubKey.Length > 3) && (trimSubKey != ""))
        {
            if (trimSubKey.Contains(","))
            {
                string[] values = trimSubKey.Split(',');

                SubGUID = values[0];
                eType = values[1];
            }
            else 
            { 
                SubGUID = trimSubKey; 
                eType = ""; 
            }
        }
        else 
        { 
             SubGUID = ""; 
             eType = ""; 
        }
    }
    catch (Exception ex)
    {
        logger.Error("Error : " + ex.Message );
    }

    if (dbmoddate == null)
    {
        DateTime no_listinsetdate = DateTime.Now;
        String insertQuery = "INSERT INTO NO_table (CreatedDate, ModifiedDate, ID, eType, SubGUID, DbDate) VALUES (@CreatedDate, @ModifiedDate, @ID, @eType, @SubGUID, @DbDate,)";

        using (SqlCommand insertCommand = new SqlCommand(insertQuery, connection))
        {
             insertCommand.Parameters.AddWithValue("@CreatedDate", no_list.CreatedDate);
             insertCommand.Parameters.AddWithValue("@ModifiedDate", no_list.ModifiedDate);
             insertCommand.Parameters.AddWithValue("@ID", no_list.ID);
             insertCommand.Parameters.AddWithValue("@eType", eType);
             insertCommand.Parameters.AddWithValue("@SubGUID", SubGUID);
             insertCommand.Parameters.AddWithValue("@DbDate", no_listinsetdate);

             insertCommand.ExecuteNonQuery(); // execute the query
         }
    }
    else if (eModifiedDate > dbmoddate)
    {
        DateTime no_listinsetdate = DateTime.Now;
        String updateQuery = "UPDATE  NO_table SET CreatedDate = @CreatedDate, ModifiedDate = @ModifiedDate, ID = @ID, eType = @eType, SubGUID = @SubGUID, DbDate = @DbDate WHERE ID = '" + Id + "'";

        using (SqlCommand updateCommand = new SqlCommand(updateQuery, connection))
        {
            updateCommand.Parameters.AddWithValue("@CreatedDate", no_list.CreatedDate);
            updateCommand.Parameters.AddWithValue("@ModifiedDate", no_list.ModifiedDate);
            updateCommand.Parameters.AddWithValue("@ID", no_list.ID);
            updateCommand.Parameters.AddWithValue("@eType", eType);
            updateCommand.Parameters.AddWithValue("@SubGUID", SubGUID);
            updateCommand.Parameters.AddWithValue("@DbDate", no_listinsetdate);

            updateCommand.ExecuteNonQuery(); // execute the query
        }
    }
}

任何加快處理速度的方法...都需要花費大量時間才能完成操作...或者有些時候我會收到超時錯誤...

謝謝

這是在此處實際具有編碼解決方案的廣泛方法,但是您應該能夠根據一般建議自己創建一個:

如果您編寫了執行此操作的SQL過程,則可能會節省很多網絡往返時間。 進一步的優化將導致此SQL過程獲取一批記錄而不是單個記錄,因此您可以例如發送1000條記錄,該過程將遍歷它們,並且每執行一次查詢並生成更新/插入。 這意味着結果不必在網絡上來回移動,從而減少了流量並縮短了運行時間。

也許可以將您的操作假定為單個MERGE命令,而不是查詢和更新/插入。 這取決於您的表結構,數據和意圖。

Google的條款: stored proceduretable typeMERGE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM