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记录的操作。。出现未找到数据的问题是不是我上面说的呢??该怎么解决呢??希望大家踊跃讨论。。谢过!

解决方案 »

  1.   

    是不是由于有Delete操作,rowid变了。
      

  2.   

    command.Parameters.Clear();
    重新定义OracleCommand 
    分页查询数据
      

  3.   

    我还是觉得应该是CPU分配时间的问题。。
    运行command.ExecuteNonQuery();到一半的时候暂停了。。
    然后等获得时间片,因为上次运行command.ExecuteNonQuery();没有返回值,
    所以程序继续运行多一次,导致找不到rowid(因为上次运行的时候是在存储过程中运行,是在数据库中运行,已经把上次的rowid对应的记录删除了。)各位觉得我上面的判断是否合理,该怎么解决???
      

  4.   

    会不会是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全部变了??导致找不到数据呢??我定义一个主键看看。
      

  5.   

    详细查看表的结构,看是否影响了datareader的操作,另:删除操作应该和当前的操作分开,或是删除后应该更新datareader
      

  6.   

    实在不知道问题出在哪了。。现在我的程序流程是:
    1.datareader = cmd.ExecuteReader();然后循环datareader.Read()将数据插入数组。
    2.然后循环数组(主键),传递每个值到存储过程执行(存储过程将该主键对应的行更新(在表A),当达到一个阀值就将记录插入log表(表B),并删除表A中的值)执行上面的步骤时经常抛出异常:未找到任何数据。这究竟是为什么啊??救救我吧。。都没碰到过这种情况吗??
    如果这个流程不好,那哪位高人指点下怎么实现吧。。