C# 在读取行期间更新数据库列
每次读取行时,我都需要更改数据库表中的列值。具体来说,在读取行之后,我必须将列SENT设置为1(默认情况下,在读取之前,该值为0) 我的代码是:C# 在读取行期间更新数据库列,c#,mysql,sql-update,sqldatareader,C#,Mysql,Sql Update,Sqldatareader,每次读取行时,我都需要更改数据库表中的列值。具体来说,在读取行之后,我必须将列SENT设置为1(默认情况下,在读取之前,该值为0) 我的代码是: var sqlCommand = "SELECT * FROM detector_output WHERE SENT=0"; var Command = new MySqlCommand(sqlCommand, connection); MySqlDataReader reader = Command.ExecuteReader(); while (r
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”
查询中不使用
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);
还可以使用来处理连接、命令和读卡器。我不需要为列ident添加值,但当我有ident=ID(ID是表的主键)时,我需要将SENT column更新为1您为什么要对所有可用行执行选择,然后在应用程序处理这些行时进行单独更新?您是否考虑过在处理中途抛出错误或在尝试更新行时数据库不可用的影响?是的,对数据库表的访问由3个不同的进程(应用程序)完成。我每5分钟读取一次数据库,并且只选择尚未读取的行(column SENT的值为0)。在那之后,我标记新行设置SENT=1(使用update命令),以便以后不读取它…您如何处理波动性或竞争条件?如果流程A选择了数据,但在流程B准备捕获和处理数据时只更新了1/3的行,该怎么办?我只写了很少的数据(仅警报事件…),例如一天发生1次…因此我认为我没有波动性或竞争条件的问题。我只需要选择未发送的数据(发送=0),并在发送数据后将此列值设置为1