ADO.NET大批量更新數據


public static void SqlBulkUpdate()
{
    DataTable dt = ExcelHelper.ImportExcelFile("d://User1.xls"); //將Excel中的數據導入到DataTable中 10000條數據(作為更新數據的數據源)
    DateTime begin = DateTime.Now;
    string connectionString = connStr;
    using (SqlConnection conn = new SqlConnection(connectionString))
    {
        conn.Open();
        SqlDataAdapter sd = new SqlDataAdapter();
  //這200條數據僅僅是作為模板使用(相當於一個臨時表,到時候用來放置需要更新的數據)
        sd.SelectCommand = new SqlCommand("select top 200 Id,Name,Age,Email,Date from T_Test", conn);
        DataSet dataset = new DataSet();
        sd.Fill(dataset);
        Random r = new Random(1000);
        sd.UpdateCommand = new SqlCommand("Update T_Test set Name=@name,Age=@age,Email=@email,Date=@date where id=@id", conn);
        sd.UpdateCommand.Parameters.Add("@name", SqlDbType.Char, 100, "name");
        sd.UpdateCommand.Parameters.Add("@age", SqlDbType.Int, 8, "age");
        sd.UpdateCommand.Parameters.Add("@email", SqlDbType.VarChar, 100, "email");
        sd.UpdateCommand.Parameters.Add("@date", SqlDbType.VarChar, 100, "date");
        sd.UpdateCommand.Parameters.Add("@id", SqlDbType.VarChar, 100, "id");
        sd.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
        sd.UpdateBatchSize = 0;
       //真正進行更新的是這一段
        for (int count = 0; count < dt.Rows.Count-1;)
        {                  
            for (int i = 0; i < 200; i++, count++)
            {
                if (count > dt.Rows.Count - 1) break;
                dataset.Tables[0].Rows[i].BeginEdit(); //對 System.Data.DataRow 對象開始編輯操作。
                dataset.Tables[0].Rows[i]["Name"] = dt.Rows[count][1];
                dataset.Tables[0].Rows[i]["Age"] = dt.Rows[count][2];
                dataset.Tables[0].Rows[i]["Email"] = dt.Rows[count][3];
                dataset.Tables[0].Rows[i]["Date"] = dt.Rows[count][4];
                dataset.Tables[0].Rows[i]["Id"] = dt.Rows[count][0];//必須要保證dt中的Id在數據表中存在,否則會報錯,比如dt中的Id=1000,那么數據表中也需要有一條Id=1000的數據
                dataset.Tables[0].Rows[i].EndEdit();//終止發生在該行的編輯。
            }
   //Update:為指定 System.Data.DataTable 中每個已插入、已更新或已刪除的行調用相應的 INSERT、UPDATE 或 DELETE 語句。
            sd.Update(dataset.Tables[0]);
        }
        dataset.Tables[0].Clear();
        sd.Dispose();
        dataset.Dispose();
        conn.Close();
    }
    TimeSpan ts = DateTime.Now - begin;//更新一萬條數據2秒左右
}
注意上面的更新操作是指在一個十萬,百萬,千萬條記錄中我要不斷更新其中的記錄,這些要更新的記錄並不是從頭
 
到尾這樣的順序,只是不斷地根據條件更新任何記錄,我不可能把成百上千萬記錄先Fill到ds中然后在ds中Select到
 
這條記錄然后更新,所以每200次更新操作填入一次DataTable中提交,就實現了JDBC的addBat和executeBat操作.

方案二、
/// <summary>
/// 批量更新
/// </summary>
/// <param name="dt">數據源</param>
/// <param name="columns">columns是要插入的列表</param>
/// <param name="tableName">tableName是要插入的表名</param>
/// <returns></returns>
public static bool MultUpdata(DataTable dt, string columns, string tableName)
{
    using (SqlConnection conn = new SqlConnection(connStr))
    {
         //保證取一個空表
        string sql = string.Format("select {0} from {1} where id=0", columns, tableName);
        using (SqlCommand cmd = new SqlCommand(sql, conn))
        {
            try
            {
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = new SqlCommand(sql, conn);
                SqlCommandBuilder scb = new SqlCommandBuilder(adapter);
                scb.ConflictOption = ConflictOption.OverwriteChanges;
                scb.SetAllValues = true;
                foreach (DataRow dr in dt.Rows)
                {
                    if (dr.RowState == DataRowState.Unchanged)
                    {
                        dr.SetModified();
                    }
                    adapter.Update(dt);
                    dt.AcceptChanges();
                    adapter.Dispose();
                }
            }
            catch (System.Data.SqlClient.SqlException e)
            {
                conn.Close();
                return false;
            }
        }
    }
    return true;
}
注意:數據集行的狀態RowState必須是Modified狀態,不是的話需要設置一下,還有就是更新的數據集中必須包含主鍵,沒有的話就會報錯。

重要的一點就是data.AcceptChanges();這句代碼,如果注釋掉的話,雖然myDataAdapter.Update(data);這段代碼更新了,但是數據庫那邊還是不行的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM