c# - 从 C# 在 SQL Server 中批量更新
问题描述
我必须从 C# 更新 SQL Server 表中的多条记录。以下是我必须遵循的步骤,下面是代码。该代码正在运行,但该过程花费的时间比预期的要长得多。我需要一种快速更新 10000 条记录的方法,不确定批量复制是否适用于更新。
我已经看到其他答案有批量插入临时然后更新..但是该更新有一个语句,在这里我需要根据 Excel 数据更新数据库中的记录,为此我必须循环每个 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 注入是不可能的)。
如果您想处理任何错误(由于无效数据导致更新失败),您将需要一些更复杂的东西。
推荐阅读
- charts - 如何在 jasper 报告 3d 条形图中显示总和值?
- arrays - 无法访问二级 JSON 字符串
- apache-kafka - 如何使用 Kafka 消费者为 Flink CEP 编写 Junit 测试代码
- reactjs - react-native-image-picker 视频的持续时间
- dart - DropdownMenuItem 如何获取 Text 小部件的字符串数据
- javascript - 如何将 JavaScript 图像灯箱更改为视频灯箱
- firebase - 如何将 currentUser 电子邮件插入实时数据库
- git - 在 jenkins 中从 github 测试 Laravel 项目
- ethereum - 这些交易所的 ETH 交易会在 https://etherscan.io/txs 上列出吗?
- python - 函数需要太多时间从数据库循环处理(3000次)