C# 如何在foreach循环上处理选择、更新查询?
服务器A:公共字符串connStr=数据源=PH-09-5336;初始目录=目录数据库;综合安全=真实 服务器B:公共字符串connWIP=Data Source=PWODU-COGNOSDB3;初始目录=BI_源 我有一种从excell文件向InventoryDB.DBO.FG_FILLIN插入记录的方法 从BI_SOURCE.dbo.ODU_WIP_PI选择记录,然后更新InventoryDB.dbo.FG_FILLIN上的空记录站点编号(如果其序列号与BI_SOURCE.dbo.ODU_WIP_PI序列号匹配) 问题: 我尝试更新13000条记录,更新需要5分钟。 我需要更新新插入的记录InventoryDB.DBO.FG_FILLIN,它只有itemnumber有空记录 但在我的代码中,它循环并再次更新InventoryDB.DBO.FG_FILLIN中的所有记录 我真的陷入了这个问题C# 如何在foreach循环上处理选择、更新查询?,c#,sql-server,excel,C#,Sql Server,Excel,服务器A:公共字符串connStr=数据源=PH-09-5336;初始目录=目录数据库;综合安全=真实 服务器B:公共字符串connWIP=Data Source=PWODU-COGNOSDB3;初始目录=BI_源 我有一种从excell文件向InventoryDB.DBO.FG_FILLIN插入记录的方法 从BI_SOURCE.dbo.ODU_WIP_PI选择记录,然后更新InventoryDB.dbo.FG_FILLIN上的空记录站点编号(如果其序列号与BI_SOURCE.dbo.ODU_W
-------------------------------------INSERT RECORDS----------------------------------------
using (SqlConnection conn = new SqlConnection(connStr))
{
using (SqlCommand cmd = new SqlCommand("Insert into dbo.FG_FILLIN Select * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=" + filepath1 + ";HDR=YES','SELECT * FROM [" + Sheetname1 + "$]')", conn))
{
try
{
conn.Open();
cmd.ExecuteNonQuery();
txtsheet1.Text = string.Empty;
txtpath1.Text = string.Empty;
txtpath1.Focus();
MessageBox.Show("FILL IN Mass Upload Success!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
txtsheet1.Text = string.Empty;
txtpath1.Text = string.Empty;
txtpath1.Focus();
}
finally
{
if (conn.State == ConnectionState.Open) cmd.Connection.Close();
conn.Close();
}
}
---------------------------------SELECT UPDATE -----------------------------------
public void Update()
{
using (SqlConnection conn = new SqlConnection(connWIP))
{
try
{
conn.Open();
using (SqlDataAdapter dAd = new SqlDataAdapter("select WIP_serialNumber, WIP_ItemID from BI_SOURCE.dbo.ODU_WIP_PI", conn))
{
DataTable data = new DataTable();
dAd.Fill(data);
using (SqlConnection conn2 = new SqlConnection(connStr))
{
conn2.Open();
try
{
foreach (DataRow recordFromServerA in data.Rows)
{
using (SqlCommand dCmd = new SqlCommand("update [dbo].[FG_FILLIN] SET ItemNumber=@ItemNumber where SerialNumber=@SerialNumber", conn2))
{
dCmd.Parameters.AddWithValue("@ItemNumber", recordFromServerA["WIP_ItemAlias"]);
dCmd.Parameters.AddWithValue("@SerialNumber", recordFromServerA["WIP_serialNumber"]);
dCmd.ExecuteNonQuery();
}
}
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
finally
{
if (conn2.State == ConnectionState.Open) conn2.Close();
}
}
}
MessageBox.Show("All Records Updated Successfully!");
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
finally
{
if (conn.State == ConnectionState.Open) conn.Close();
}
}
}
#endregion
如果我正确地理解了您的问题,您可能只需执行一条SQL语句,而不是单独循环每一行,就可以大大加快更新过程 这个怎么样?将记录加载到表A FG_FILLIN中后,创建一个SQL UPDATE语句,该语句使用表A到表B的联接,其中表A中的ItemNumber字段为null。像这样的东西应该可以做到:
UPDATE [dbo].[FG_FILLIN]
SET ItemNumber = table2.WIP_ItemID
FROM [dbo].[FG_FILLIN] INNER JOIN BI_SOURCE.dbo.ODU_WIP_PI as table2
ON [dbo].[FG_FILLIN].SerialNumber = table2.WIP_SerialNumber
WHERE [dbo].[FG_FILLIN].ItemNumber IS NULL
还有一件事,
你也可以把你的东西包装成
using(var scope = new TransactionScope())
{
stuff
scope.Complete();
}
使之成为交易