使用带有乘数函数的数据适配器编写更新 SQL 查询

Posted

技术标签:

【中文标题】使用带有乘数函数的数据适配器编写更新 SQL 查询【英文标题】:writing an update SQL Query using dataadapter with a muliplier function 【发布时间】:2011-03-08 00:22:48 【问题描述】:

我有一个使用 c# 的 Windows 应用程序。我正在使用 Northwind Products 表,我需要以相同的百分比更新所有单价。我知道如何在 SELECT 查询中编写它,但是在如何使用乘法运算符和 sql 参数以及 UPDATE 查询表单类将更新写入我的数据访问层时遇到了问题,它显示在 SQL 查询中,但我没有放置在正确的位置,因为我得到空值。谁能帮我写更新字符串?这是我正在努力解决的 SQL 部分的 sn-p:

//Update using SQL string
productDataAdapter.UpdateCommand.CommandText =
    "UPDATE Products SET " +
    "UnitPrice * " + multiplier   = "@UnitPrice";

holdParm = new SqlParameter();
holdParm.ParameterName = "@UnitPrice";
holdParm.SourceColumn = "UnitPrice";
productDataAdapter.UpdateCommand.Parameters.Add(holdParm);    

//Open connection
productDataAdapter.InsertCommand.Connection.Open();

//usd data adapter to update the Products table
rowCount = productDataAdapter.Update(productsDataSet, "Products");

return rowCount;      

【问题讨论】:

您的 T-SQL 语法不正确。也许是错字? 【参考方案1】:

只执行查询怎么样?

decimal factor = 1.1; // for example...
string sql = "UPDATE products set unitPrice = unitprice*" + factor.ToString();

然后使用dbCommand对象,设置如下:

IDbCommand cmd = Database.CreateCommand(sql, CommandType.Text);
cmd.ExecuteReader();

这样,您运行的是 UPDATE 并且只有更新,您知道它会做什么以及何时发生。当然,根据需要过滤该 UPDATE,以便只更新您要更新的内容。

【讨论】:

谢谢丹尼尔。这让我更接近了。我认为 ToString() 是帮助构建的一小部分。我不知道用 IDbCommand 重写它。现在的问题是我没有返回任何行。我的行数为零。似乎除此之外它会起作用。 嗯。当我第一次开始使用数据库更新时,我曾经关注返回的行数。但这不是一个可靠的衡量标准。有些系统总是返回零,因为我处理了许多类型的数据库,我就放弃了。你确定没有更新吗?【参考方案2】:

您正在以非标准方式使用 DataAdapter。我建议您考虑两种不同的方法:

    更新内存数据;换句话说:使用 C# 代码更新数据集中 Products 表的行。进行更改后,您可以使用以标准方式配置的 DataAdapter(或 TableAdapter)将它们持久化回数据库,这样它就可以将数据传入和传出内存数据集。 在将数据加载到 DataSet 之前或将其从 DataSet 保存到数据库之后,直接使用 TSQL 更新数据。在这种情况下,您将使用查询表适配器或 SqlClient.SqlCommand 对象。

当您使用 DataAdapter 将数据保存回数据库时,我看不出进行转换有什么好处。我可以看到这种方法的一个缺点是,它会让习惯于使用 DataAdatpers 简单地加载和保存数据的程序员感到困惑。

【讨论】:

感谢您的想法。我对此很了解。如果我遵循方法 1,我是否必须创建一个 for 循环来读取 UnitPrice 列的每一行,然后一次将乘法应用于一列,然后一次将结果传递回数据访问层?我必须等待用户输入到文本框的百分比先乘以,所以不确定我是否可以应用方法 2。

以上是关于使用带有乘数函数的数据适配器编写更新 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

无法通过带有 TableAdapter 的视图更新 SQL

SQL 命令生成器查询值

带有“lag()”窗口函数的 PostgreSQL 更新查询

带有在子查询中生成的值的 Oracle SQL 更新语句

使用带有更新 SQL 的子查询

添加新的可空列后,是不是需要更新某个表上的每个 C# SQL 查询?