簡體   English   中英

從C#批量更新SQL Server

[英]Bulk Update in SQL Server from C#

我必須從C#更新SQL Server表中的多個記錄。 以下是我必須遵循的步驟,下面是代碼。 代碼正在運行,但這個過程花費的時間遠遠超過預期。 我需要一種快速更新10000條記錄的方法,不確定批量復制是否適用於更新。

我已經看到其他答案,其中Bulk插入到temp然后更新..但是該更新有一個語句,在這里我需要根據Excel數據更新DB中的記錄,為此我必須循環每個excel記錄。所以我怎樣才能實現更快的更新。

1)讀取Excel數據並將數據復制到數據表中

string strDirectory = string. Empty;
strDirectory = System.IO.Directory.GetCurrentDirectory() + "\\" + "Filename.xlsx";
string Connection String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " + strDirectory + "; Extended Properties = \"Excel 12.0;HDR=YES;IMEX=1\"";
using (OleDbConnection conn = new OleDbConnection(Connection String))
{    
    conn.Open();

    DataTable schemaTable = conn.GetOleDbSchemaTableOleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

    DataRow schemaRow = schemaTable. Rows[0];
    string sheet = schemaRow["TABLE_NAME"].ToString();
    string query = "SELECT * FROM [" + sheet + "]";
    OleDbDataAdapter daexcel = new OleDbDataAdapter(query, conn);
    daexcel.Fill(dt);
    conn.Close();
}

2)在更新到表之前對數據表數據進行一些操作。

string strsqlst = string. Empty;
using (SqlConnection sqlConn = new SqlConnection(Connectionstring))
{
    sqlConn.Open();
    SqlCommand cmd;

    StringBuilder sb = new StringBuilder();
    sb.AppendLine("DataTable content:");
    foreach (DataRow row in dt.Rows)
    {
        if (row.ItemArray[0].ToString() == "")
            break;

        strsqlst = "Update  table Set col1= " + row.ItemArray[4].ToString() + "  ,col2= " + row.ItemArray[5].ToString() + " where <Condition>'";

        cmd = new SqlCommand(strsqlst, sqlConn);

        cmd.CommandType = CommandType.Text;
        cmd.ExecuteNonQuery();         
    }
    sqlConn.Close();
}

SqlCommand可以是整個SQL 批處理 ,並不限於單個語句。 因此,您可以創建具有10,000個UPDATE語句的單個大批量,或者將其分成例如20個批次,每個500個。

換句話說,您可以使用CommandText創建一個命令,如下所示:

UPDATE [T] SET Col1='Value1', Col2='Value2' WHERE [Id] = 1;
...
UPDATE [T] SET Col1='Value999', Col2='Value1000' WHERE [Id] = 500;

也就是說,您應該為所有數據值使用參數(以確保無法進行SQL注入)。

如果您想處理任何錯誤(由於數據無效而導致更新失敗),您將需要更復雜的東西。

暫無
暫無

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

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