Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将datatable用作SQL Server临时表?_C#_Sql Server_Datatable - Fatal编程技术网

C# 如何将datatable用作SQL Server临时表?

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

我有一个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.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)。