我有一个SQL Update查询和一个C#的DataTable。我想将此DataTable用作SQL Server的TempTable。查询将在C#端执行(通过ADO.NET)
请检查下面的C#代码 -
1)C#DataTable:
DataTable dt = new DataTable();
2)更新查询:
using (var cmd = cn.CreateCommand())
{
cmd.CommandText = "UPDATE p
SET p.Name = t.Name, p.Type = t.Type
FROM Product AS p
INNER JOIN dt AS t ON p.id = t.id"
cmd.ExecuteNonQuery();
}
在我的情况下,我无法使用SQL存储过程。
答案 0 :(得分:1)
foreach(DataRow dr in dt.Rows)
{
cmd.CommandText = "UPDATE Product
SET Name = @name, Type = @type
WHERE id = @id";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@name", dr["Name"].ToString());
cmd.Parameters.AddWithValue("@type", dr["Type"].ToString());
cmd.Parameters.AddWithValue("@id", dr["id"].ToString());
cmd.ExecuteNonQuery();
}
除非在SQL Server中创建了与临时表匹配的新表类型,否则不能在SQL Server的内存表中使用。这是一个开销。相反,您可以使用foreach
。您可以使用id
表格逐个更新每个dt
。
使用动态sql的替代方式:
cmd.CommandText = string.Empty;
foreach(DataRow dr in dt.Rows)
{
cmd.CommandText += string.Format(@"UPDATE Product
SET Name = '{0}', Type = '{1}'
WHERE id = '{2}';",dr["Name"].ToString(),dr["Type"].ToString(),dr["id"].ToString()) ;
}
cmd.ExecuteNonQuery();
答案 1 :(得分:0)
我不确定这是否可行,但我想出了一个尝试声明一个表变量,向其插入值,然后更新目标表,所有这些都在内联查询中:
var sb = new StringBuilder("DECLARE @T as Table (Id int, Name varchar(20), Type int ); ");
sb.Append("INSERT INTO @T VALUES ");
foreach (DataRow row in dt.Rows)
{
sb.Append("(").Append(row["Id"]).Append(", '");
sb.Append(row["Name"]).Append("', '");
sb.Append(row["Type"]).Append("'),");
}
sb.Remove(sb.Length - 1, 1);
sb.Append(";UPDATE p ");
sb.Append("SET p.Name = t.Name, ");
sb.Append("p.Type = t.Type ");
sb.Append("FROM Product AS p ");
sb.Append("INNER JOIN @T AS t ON p.id = t.id");
var query = sb.ToString();