【问题标题】:Update database column during the reading of rows在读取行期间更新数据库列
【发布时间】:2015-06-05 12:47:49
【问题描述】:

每次读取一行时,我都需要更改数据库表中的列值。具体来说,在读取行之后,我必须设置列 SENT=1(默认情况下,在读取之前,该值为 0)。

我的代码是:

var sqlCommand = "SELECT * FROM detector_output WHERE SENT=0";
var Command = new MySqlCommand(sqlCommand, connection);
MySqlDataReader reader = Command.ExecuteReader();
while (reader.Read())
{
    var ident = reader.GetString(0);
    var SENSOR_TYPE = reader.GetString(1);
    var MSG_NAME = reader.GetString(2);
    var DATA_NAME = reader.GetString(3);
    var VALUE = reader.GetString(4);
    var TIMESTAMP = reader.GetString(5);

    var connectionUP = new MySqlConnection(cs);
    connectionUP.Open();
    var sqlCommandUPDATE = "UPDATE detector_output SET SENT=1 WHERE ID=ident";
    var CommandUpdate = new MySqlCommand(sqlCommandUPDATE, connectionUP);
    CommandUpdate.ExecuteReader();        

我遇到的错误是:

where 子句中的未知列 'ident' ...

【问题讨论】:

  • 您是否有任何理由对所有可用行执行 SELECT,然后在应用程序处理它们时单独更新?您是否考虑过您的处理在处理过程中抛出错误或在尝试更新行期间数据库不可用的影响?
  • 是的,对数据库表的访问是由 3 个不同的进程(应用程序)完成的。我每 5 分钟读取一次数据库,并且只选择尚未读取的行(列 SENT=0 的值)。之后,我标记新行设置 SENT=1(使用更新命令),以便以后不读取它...
  • 您如何处理波动性或竞争条件?如果进程 A 选择了数据,但在进程 B 准备好捕获和处理数据时只更新了 1/3 的行怎么办?
  • 我只写了很少的数据(只有警报事件......),例如一天中可能发生 1 次......所以我认为我没有波动或竞争条件的问题。我只需要选择未发送的数据(SENT=0)并在发送数据后将此列值设置为1

标签: c# mysql sql-update sqldatareader


【解决方案1】:

您没有在查询中使用ident 作为变量。您将其定义为 ID=ident,这就是您的提供者混淆的原因,它认为您实际上尝试过滤您的 ID 列值等于 ident 列值的位置。

如果ident 是一个字符呢?那么,它会被定义为ID = 'ident',不是吗?

为它定义一个参数,然后添加它的值。

var sqlCommandUPDATE = "UPDATE detector_output SET SENT=1 WHERE ID = @ident";
var CommandUpdate = new MySqlCommand(sqlCommandUPDATE, connectionUP);
CommandUpdate.Parameters.AddWithValue("@ident", ident);

也可以使用using statement 来处理你的连接、命令和阅读器。

【讨论】:

  • 我不需要为 ident 列添加值,但是当我有一个 ident=ID 时,我需要将 SENT 列更新​​为 1(ID 是我的表的主键)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多