C# 如何将datatable用作SQL Server临时表?
我有一个SQL更新查询和一个C#数据表。我想使用这个数据表作为SQL Server的一个诱人工具。查询将在C#端执行(通过ADO.NET) 请检查下面的C代码- 1) C#数据表:C# 如何将datatable用作SQL Server临时表?,c#,sql-server,datatable,C#,Sql Server,Datatable,我有一个SQL更新查询和一个C#数据表。我想使用这个数据表作为SQL Server的一个诱人工具。查询将在C#端执行(通过ADO.NET) 请检查下面的C代码- 1) C#数据表: DataTable dt = new DataTable(); 2) 更新查询: using (var cmd = cn.CreateCommand()) { cmd.CommandText = "UPDATE p SET p.Name = t.Name, p.Ty
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存储过程
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
。您可以使用dt
表逐个更新每个id
使用动态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();
我不确定这是否可行,但我提出了一个尝试,即声明一个表变量,向其插入值,然后更新目标表,所有这些都在一个内联查询中:
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();
您能否详细说明一下
我想将此数据表用作SQL Server的诱人工具。
我从未尝试将表值参数传递给内联查询。我有一种感觉,这是不可能的。您的SQL server无法看到您的局部变量,您可以做相反的操作,使用SQL到linq,然后使用您的局部表。。。因为它会将劳动力向上分,为什么不能使用存储过程?#游戏是战争,我想使用C的数据表进行内联查询的内部连接。对于大数据来说,这是一种糟糕的方法。如果datatable中有1000行,那么1000次更新查询将在数据库服务器上执行。这是正确的,我不能使用循环,因为记录的数量很大。我可以创建SQL类型并在内部联接中使用吗?另一个选项是创建具有多个更新查询的动态SQL是的,您还可以创建SQL类型并在联接中使用它。但是这种SQL类型除了这个查询之外没有多大用处#Akshey,谢谢您的更新。我尝试用SQL类型来实现这一点,但不幸的是无法实现。你能举个例子吗?佐哈尔,我不想在这里使用循环,因为记录的数量很大。请建议一种不用循环的方法。循环只在c#中,不应该花费太长时间来完成。为什么不能使用存储过程?实际上,因为我们已经更新了SQLite db(SQLite文件)的一个表。我们将发送到我们的移动应用程序/设备(移动应用程序:Android/IOS)。