【发布时间】: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