public static void ThreadRun()
{
string sms_id = ""; OracleConnection conn = new OracleConnection(ConnectionString);
OracleCommand command = new OracleCommand("update_test", conn);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("rowid", OracleType.VarChar, 20);
command.Parameters["rowid"].Direction = ParameterDirection.Input; try
{ OracleCommand cmd = new OracleCommand("select rowid,a.* froom sn_test a", conn);
conn.Open();
OracleDataReader reader = cmd.ExecuteReader(); while (reader.Read())
{
sms_id = reader.GetString(0);
string Url = ToUTF_8(reader.GetString(1), reader.GetString(2));
string ret = SetSMS(Url); if (ret.Contains("0"))
{
command.Parameters["sms_rowid"].Value = sms_id;
command.ExecuteNonQuery();//执行存储过程,我觉得问题出在这
}
}
reader.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);//当datareader返回的数据较大,比如5000条时,经常抛出异常:未找到任何数据
}
finally
{
conn.Close();
conn.Dispose();
command.Dispose();
}
}
上面的代码其实就是对于select到的每个rowid,执行存储过程更新数据,但是数据较大的时候偶尔会抛出异常:未找到任何数据,这段代码是个线程执行函数。我觉得会不会是线程执行过程中刚好执行到command.ExecuteNonQuery()一般就暂停了,然后得到CPU时间片之后再次运行的时候,又重新运行一次command.ExecuteNonQuery(因为上次没返回),导致表中的数据不一致。因为我在存储过程update_test中有delete记录的操作。。出现未找到数据的问题是不是我上面说的呢??该怎么解决呢??希望大家踊跃讨论。。谢过!
重新定义OracleCommand
分页查询数据
运行command.ExecuteNonQuery();到一半的时候暂停了。。
然后等获得时间片,因为上次运行command.ExecuteNonQuery();没有返回值,
所以程序继续运行多一次,导致找不到rowid(因为上次运行的时候是在存储过程中运行,是在数据库中运行,已经把上次的rowid对应的记录删除了。)各位觉得我上面的判断是否合理,该怎么解决???
我是先从表sn_test里面读取一批数据到datareader中。然后再我循环datareader.Read(),得到某一行的rowid,然后对应到表中,删除哪一行。是不是删除一行后表中的rowid变了??
比如,我一开始select rowid,a.col1,a.col2 from table 到OracleDataReader ,
然后循环datareader.Read(),得到每个rowid,然后再存储过程中执行delete from table where rowid = '???'
是不是之前的如果删除某一行,表中的其他行的rowid全部变了??导致找不到数据呢??我定义一个主键看看。
1.datareader = cmd.ExecuteReader();然后循环datareader.Read()将数据插入数组。
2.然后循环数组(主键),传递每个值到存储过程执行(存储过程将该主键对应的行更新(在表A),当达到一个阀值就将记录插入log表(表B),并删除表A中的值)执行上面的步骤时经常抛出异常:未找到任何数据。这究竟是为什么啊??救救我吧。。都没碰到过这种情况吗??
如果这个流程不好,那哪位高人指点下怎么实现吧。。