在C#開發(fā)的過程中,使用MySQL關(guān)系型數(shù)據(jù)庫系統(tǒng)更新大批量數(shù)據(jù)是一種常見的需求。采用C#與MySQL進行數(shù)據(jù)交互,可以進行insert、delete、select等操作,都比較常見。但在需要更新大批量數(shù)據(jù)時,使用C#與MySQL進行大批量Update卻會降低程序的運行效率。
為了解決這個問題,可以采用MySQL內(nèi)置的 LOAD DATA INFILE 語句,將需要更新的數(shù)據(jù)導(dǎo)入到臨時表,再使用MySQL的 UPDATE 語句進行批量更新。
以下是一個C#方法,用以實現(xiàn)大批量Update操作。其中需要連接MySQL數(shù)據(jù)庫,使用LOAD DATA INFILE 語句將需要更新的數(shù)據(jù)導(dǎo)入到臨時表中,并使用UPDATE語句進行更新:
public void BatchUpdateMySqlData(DataTable dt, string tableName, string primaryKey, MySqlConnection conn) { if (dt.Rows.Count<= 0) return; MySqlCommand cmd = new MySqlCommand(); cmd.Connection = conn; MySqlTransaction transaction = null; try { conn.Open(); transaction = conn.BeginTransaction(); string tmpTableName = tableName + "_tmp"; //創(chuàng)建臨時表 cmd.CommandText = string.Format("CREATE TEMPORARY TABLE {0} LIKE {1}", tmpTableName, tableName); cmd.ExecuteNonQuery(); //將數(shù)據(jù)導(dǎo)入到臨時表 string insertSql = string.Format("LOAD DATA LOCAL INFILE '{0}' INTO TABLE {1} FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES", filePath, tmpTableName); cmd.CommandText = insertSql; cmd.ExecuteNonQuery(); //更新數(shù)據(jù) string updateSql = string.Format("UPDATE {0} AS t INNER JOIN {1} AS tmp ON t.{2}=tmp.{2} SET t.a = tmp.a,t.b = tmp.b", tableName, tmpTableName, primaryKey); cmd.CommandText = updateSql; cmd.ExecuteNonQuery(); //刪除臨時表 cmd.CommandText = string.Format("DROP TABLE {0}", tmpTableName); cmd.ExecuteNonQuery(); transaction.Commit(); } catch (Exception ex) { if (transaction != null) transaction.Rollback(); throw ex; } finally { if (conn != null && conn.State == ConnectionState.Open) conn.Close(); } }
以上代碼實現(xiàn)了通過C#與MySQL進行大批量數(shù)據(jù)更新的操作。其中將需要更新的數(shù)據(jù)導(dǎo)入到臨時表中,并使用UPDATE語句進行更新。在代碼中使用了MySQL內(nèi)置的 LOAD DATA INFILE 語句,可以有效提高更新大批量數(shù)據(jù)的效率。