2002-9-3 16:41:00,一位 七七 大侠提出了一个问题: 初学dotnet,请大家帮忙 :) 
问题应该很简单,大家不要笑话哦 访问一个table ,该tyable 是先通过SQL语句访问数据库后,再用适配器fill函数填充数据的,但可能符合条件的为零个,那么这个时候table.Rows[0]处就没有任何行了,如何表示出这种情 
况? 开始想用table.Rows==null的,但不行. 
table.Rows.Count==0,也不行 
table.Rows[0].IsNull(0)也不行,因为还是访问到了Rows[0]. 还有就是,即使表里面的确有内容的,但运行时确出现异常,说位置0处没有行,而如果调试,一步步运行的话,却不会出现异常,顺利执行的。 为什么??? 请指教. 
那么他所说的 即使表里面的确有内容的,但运行时确出现异常,说位置0处没有行,而如果调试,一步步运行的话,却不会出现异常,顺利执行的 则为我遇到的问题。该问题我在很多地方发送,我很诚实的讲,没有人解决了这个问题。我个人认为大家应该看一下,也许您   也遇到过这样的问题。鉴于该问题较严重,我就给最高分!   100分。您可以把答案发送到: [email protected],然后告知我,您已经把答案发送到邮箱当中,立即发送分数。若您想把答案公众,那就更好了,分数一样的。只是前者若同样的问题,您可以再回答,再得分。后者发扬令人佩服的雷锋精神!!
在此非常感谢您能帮我这个忙,若有不解,完全可以出来提问(与该问题有关)。解决后立即发分!
万分感谢~~~~

解决方案 »

  1.   

    if (table.Rows.Count > 0)
    {
    }
    else
    {
    }对于有数据的行,注意是否有null值的列,注意排除,最好是在添加数据的时候,尽量不要插入null值
      

  2.   

    哦,您说的问题我明白了。但是我看了,确实没有null值存在,但是我在里面包含着二进制数据。但绝对不是空的,除此之外,ID用的是Guid,Name用的是String,还有一个Date(存储当前时间),一个Content(文件内容二进制),确实没有null的值而且还有一条。我在调试的时候没有问题,而使用的时候却出现了问题。换句话说,我调试的时候特意做了这样的测试(现在到了ds.tables[0].rows[0]["MyZone")语句)
    1秒钟后到下一语句         出现异常
    2秒钟后到下一语句         正常有时候还不一样。曾用过Thread.Sleep来解决,可是也不行,而且毕竟是数据库,服务器用的,老用Thread.Sleep也不是办法。而且有时候也失灵,所以就是想看看有没有好的方法来解决这个问题。还有,之所以出现了这个问题,是因为我对数据库作了修改。DataSet ds = new DataSet();...._oleDbAd.Fill ( ds, "XXX" );这时候ds正常。然后我_oleCommand.CommandText = "Update .....";_oleCommand.ExecuteNonQuery();执行成功,这时候察看数据库,数据已经更改。然后我又重新Fill一遍ds(不Fill不行)。发现ds里面的数据仍然是未修改过的数据,所以当用ds返回某行某列的数据时,问题自然就出现了。因为找不到旧字段的数据,它已经被修改了!这就是问题所在。
      

  3.   

    感谢风飘的提醒由于我第一次来CSDN,在网上也不爱聊天,发帖子,尤其是救助贴,所以说话经常语无伦次,请大家谅解,我以后一定注意!我本意是好的……
      

  4.   

    DataSet ds;
    if(ds.Tables.Count>0)
    {
    }
      

  5.   

    还有,忘了说了同样的情况,只不过代码不太一样
    (排除CommandType = CommandType.Text)_oleCommand.CommandText = "Update ....";
    _oleCommand.ExecuteNonQuery();_oleCommand1.CommandText = "Select ....";_oleDa.SelectCommand = _oleCommand1;_oleDa.Fill( ds );ds.Tables[0].rows[0]["MyZone"];同样出现问题。
      

  6.   

    哦,可能大家还没明白我的意思首先,我的提问没说清楚,实际上我问得内容是:
    即使表里面的确有内容的,但运行时确出现异常,说位置0处没有行,而如果调试,一步步运行的话,却不会出现异常,顺利执行的。 即使表里面的确有内容的,但运行时确出现异常,说位置0处没有行,而如果调试,一步步运行的话,却不会出现异常,顺利执行的。 对不起,因为尊重原作者,所以把它前面的问题也发过来了,但是我问的是这个,而不是检测是否为Null的问题。
    即使表里面的确有内容的,但运行时确出现异常,说位置0处没有行,而如果调试,一步步运行的话,却不会出现异常,顺利执行的。
      

  7.   

    我也碰到过这样的问题,也是百思不得其解。后来是这样解决的:DataTable table;
    ...
    if (table != null) table.Dispose();        // 如果table非空则清理、释放之
    xx.Fill(table);                            // 从数据库中查询数据填充table
    if (table != null && table.Rows.Count > 0) // 然后再使用table就没问题了
    {
      ...
    }你不妨也试试。
      

  8.   

    您好,我是过了,好像不太理想……DataSet ds;                        //我已经Fill它了。
    if ( ds.Tables[0] != null )
    _wrongthemeDS.Tables[0].Dispose( );    //单步跟踪的时候到了这一步,并执行
    ...    // 更新代码部分,更新了数据库当中的代码,不过直接用了SQL,并非经过ds
    ...    // 同样的代码,和前面Fill它的时一样的,第一次Fill时候成功了。_oleDbDataAdapter.SelectCommand = _oleDbSelectCommand;
    _oleDbDataAdapter.Fill( ds );最后查了查发现,ds.Table[0].Rows[0]中的字段仍然是第一次Fill的时候的字段。我就感觉好像是,他还没等更新完,就已经查询出来了,所以才出现跟踪的时候没有问题,而执行的时候……
      

  9.   

    对不起,输入错误
    DataSet ds;                        //我已经Fill它了。
    if ( ds.Tables[0] != null )
    _ds.Tables[0].Dispose( );    //单步跟踪的时候到了这一步,并执行
    ...    // 更新代码部分,更新了数据库当中的代码,不过直接用了SQL,并非经过ds
    ...    // 同样的代码,和前面Fill它的时一样的,第一次Fill时候成功了。_oleDbDataAdapter.SelectCommand = _oleDbSelectCommand;
    _oleDbDataAdapter.Fill( ds );
      

  10.   

    之所以不用Dataset来更新的原因就是DataSet太不方便,如我发送的第二个问题:关于Replace的那个问题,若用DataSet则根本无法表示。只有用SQL语句了,而恰好Dataset是离线的……
      

  11.   

    难道就没有人会吗?没有人遇到过?MVP都在不在?
      

  12.   

    table.Rows.Count==0我怎么可以啊?奇怪
      

  13.   

    这样试试:DataTable table;
    if (table != null ) table.Dispose( );
    OleDbDataAdapter.SelectCommand = "...";
    OleDbDataAdapter.Fill(table);
      

  14.   

    或者把 table 作为类的全局字段定义:class MyClass
    {
      DataGrid  grid;
      DataTable table;  void DataProc()
      {
         if (table != null) table.Dispose();
         OleDbDataAdapter.SelectCommand = "...";
         OleDbDataAdapter.Fill(table);
         grid.DataSource = table;
      }
    }
      

  15.   

    我一般是这样做的:DataSet ds;                        //我已经Fill它了。
    if ( ds.Tables[0] != null )
    _ds.Tables[0].Dispose( );    //单步跟踪的时候到了这一步,并执行
    ...    // 更新代码部分,更新了数据库当中的代码,不过直接用了SQL,并非经过dsds.Tables[0].Clear(); //在第二次fill之前clear table的内容。
    ...    // 同样的代码,和前面Fill它的时一样的,第一次Fill时候成功了。_oleDbDataAdapter.SelectCommand = _oleDbSelectCommand;
    _oleDbDataAdapter.Fill( ds );
      

  16.   

    哦,很抱歉,您们的方法我都饰演了,可是问题依旧。wuyi8808(air|skyiv.com) ,您的方法和我开始所说的差不太多,而楼下的方法我是过了,好像也不行。我个人认为该问题主要错在:(设原来MyZone字段为ActualyMe,要将MyZone字段改为Jay(地球人都知道这人是谁))当我正在Update数据库的时候,即“Update XXX SET MyZone = 'Jay'”的时候我用的并非是ds,而是ExecuteNonQuery()位于OleDbCommand的语句。那么ExecuteNonQuery()正在读取数据库的时候,他就到下一行:_oleDbCommand1.Text = "Select * From XXX Where MyZone = 'Jay'";  //注意,不是ActualyMe,而是更新后的Jay。_oleDbAd.SelectCommand = _oleDbCommand1;_oleDbAd.Fill ( ds );那么数据库的确将MyZone改为Jay了,无可厚非(我查了)然后我打算……int age = int.parse( ds.Table[0].Rows[0]["Age"].ToString );  //按理说应该返回23。可是……位置0处没有任何行,产生。
      

  17.   

    哦,对了中间还有一个ds.Table[0].Dispose() 或 ds.Table[0].Clear();
    请大家再探讨一下。谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!
      

  18.   

    我说过了,有记录,但是问题就在于 正在读取记录的同时,还要查询记录。当然这是我估计的,也可能还有其他的因素。总之调用的时候(或者Thread.Sleep())休息一小段后正常,否则出现“找不到行”的异常
      

  19.   

    快一年没登陆了。原来的帐户丢失了密码。你这个问题俺碰到过,但被俺解决了。代码发到你的邮箱,俺原来写的,看看有没有帮助。(RAF.rar),别忘了查毒,俺不保证里面没毒!内有微软关于类似问题的解答。自己多看看,这是并发问题。
      

  20.   

    您好,这几天我很忙,所以没来。太感谢您了,我终于明白了其中的原理,还是我没学基础阿……再次感谢!!!!!!!!!!为此我将120分送给您。当然,您还可以帮我下面的忙:http://community.csdn.net/Expert/topic/3923/3923288.xml?temp=.6896173再次感谢!!!!请稍等...
      

  21.   

    DataSet ds;
    if(ds.Tables[0].Rows>0)
    {
    }
    else
    {
    }