none
在做DataRow删除处理的时候出错了,大家有遇到这样的错误吗? RRS feed

  • 问题

  • 代码:dtUserInfo里大概有9万条数据,iCount有1条。程序在执行了1分多钟的时候出的错。
    另:要是iCount比较大的时候不出错。

                            while (true)
                            {
                                if (dtUserInfo.Rows.Count == iCount)
                                {
                                    break;
                                }

                                int i = rdTemp.Next(0, dtUserInfo.Rows.Count);

                                dtUserInfo.Rows[i].Delete();
                                dtUserInfo.AcceptChanges();
                            }

    错误信息

    The following information is part of the event: System.Threading.ThreadAbortException: Thread was being aborted.
       at System.Globalization.CompareInfo.CompareRegion(Void* pSortingTable, Int32 sortingLCID, String string1, Int32 offset1, Int32 length1, String string2, Int32 offset2, Int32 length2, CompareOptions options)
       at System.Globalization.CompareInfo.Compare(String string1, Int32 offset1, Int32 length1, String string2, Int32 offset2, Int32 length2, CompareOptions options)
       at System.Data.DataTable.Compare(String s1, String s2)
       at System.Data.Index.CompareRecords(Int32 record1, Int32 record2)
       at System.Data.RBTree`1.SearchSubTree(Int32 root_id, K key)
       at System.Data.RBTree`1.GetNodeByKey(K key)
       at System.Data.RBTree`1.GetIndexByKey(K key)
       at System.Data.Index.ApplyChangeAction(Int32 record, Int32 action, Int32 changeRecord)
       at System.Data.DataTable.RecordStateChanged(Int32 record1, DataViewRowState oldState1, DataViewRowState newState1, Int32 record2, DataViewRowState oldState2, DataViewRowState newState2)
       at System.Data.DataTable.SetNewRecordWorker(DataRow row, Int32 proposedRecord, DataRowAction action, Boolean isInMerge, Int32 position, Boolean fireEvent, Exception& deferredException)
       at System.Data.DataTable.SetNewRecord(DataRow row, Int32 proposedRecord, DataRowAction action, Boolean isInMerge, Boolean fireEvent)
       at System.Data.DataRow.Delete()
       at PanelMix.WebService.Service.SearchData(String strUserID, String strPassword, String strCondition).

    2009年11月9日 2:53

答案

  • // 如果 rdTemp 是 Random 类的话,可以这个考虑
    // 形成一个新的数据表,只所包含原表中随机 iCount 条记录。
    DataTable dtUserInfoCopy = dtUserInfo.Clone();
    // 如果 iCount > 1 对应执行 iCount 次 ImportRow 且得到的随机数不能重复
    dtUserInfoCopy.ImportRow(dtUserInfo.Rows[rdTemp.Next(0, dtUserInfo.Rows.Count)]);
    dtUserInfo.Dispose();

    知识改变命运,奋斗成就人生!
    2009年11月9日 3:06
    版主
  • 这个原因可能是因为频繁的调用 dtUserInfo.AcceptChanges(); 加上执行时间过长超时所致。最好的办法就是提高执行效率
    2009年11月9日 3:25
    版主
  • WebConfig里追加上这个就没问题了。。
    <httpRuntime executionTimeout="36000"/>
    2009年11月9日 7:48

全部回复

  • 刚才的错误信息是IIS的LOG,我找到画面的错误信息了,也一起发上来。
    这个要怎么改啊?

    Request timed out.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.Web.HttpException: Request timed out.

    Source Error:

    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

    Stack Trace:

    [HttpException (0x80004005): Request timed out.]
    
    2009年11月9日 3:03
  • // 如果 rdTemp 是 Random 类的话,可以这个考虑
    // 形成一个新的数据表,只所包含原表中随机 iCount 条记录。
    DataTable dtUserInfoCopy = dtUserInfo.Clone();
    // 如果 iCount > 1 对应执行 iCount 次 ImportRow 且得到的随机数不能重复
    dtUserInfoCopy.ImportRow(dtUserInfo.Rows[rdTemp.Next(0, dtUserInfo.Rows.Count)]);
    dtUserInfo.Dispose();

    知识改变命运,奋斗成就人生!
    2009年11月9日 3:06
    版主
  • // 如果 rdTemp 是 Random 类的话,可以这个考虑
    
    // 形成一个新的数据表,只所包含原表中随机 iCount 条记录。
    
    DataTable dtUserInfoCopy = dtUserInfo.Clone();
    
    // 如果 iCount > 1 对应执行 iCount 次 ImportRow 且得到的随机数不能重复
    
    dtUserInfoCopy.ImportRow(dtUserInfo.Rows[rdTemp.Next(0, dtUserInfo.Rows.Count)]);
    
    dtUserInfo.Dispose();
    
    

    知识改变命运,奋斗成就人生!
    是的,现在是在考虑提高效率,如果iCount和dtUserInfo的件数做比较,如果iCount小于一个比例值的话就追加到一个新的datatable里,大于那个比例值的话就做Delete。

    只是错误的原因还没找到。我想是不是哪的设置有问题?不到2分钟就出错了
    2009年11月9日 3:18
  • 这个原因可能是因为频繁的调用 dtUserInfo.AcceptChanges(); 加上执行时间过长超时所致。最好的办法就是提高执行效率
    2009年11月9日 3:25
    版主
  • 这个原因可能是因为频繁的调用 dtUserInfo.AcceptChanges(); 加上执行时间过长超时所致。最好的办法就是提高执行效率,可以考虑从数据库中直接取数出来

    SELECT TOP 100 * FROM [YourTableName] ORDER BY NEWID()

    知识改变命运,奋斗成就人生!

    这个比较困难,因为那些数据是从数据库里取出来后,又在程序里进行过处理的。
    我把我程序的具体写法和要实现的东西写出来,版主帮我想想怎么改善比较好。

    实现的内容:比如现在有这样一些用户信息
    表结构
    ID           Mail                  Other                     Site     UpdateTime
    1            1@111.com      Name1,AGE28           1      1999/01/01
    2            2@111.com      Name1,AGE28           2      1999/02/01
    3            2@111.com      Name2,AGE30           3      1999/03/01
    4            3@111.com      Name2,AGE30           4      1999/04/01
    5            4@111.com      Name3,AGE33           4      1999/04/01

    这个表里ID1和ID2因为名字和年龄一样,所以认为是同一个人。ID2,ID3因为Mail一样,所以也认为是同1个人,ID3和ID4也是同一个人。

    现在就是要把表里的人的抽出来,根据所输入的iCount随机取一部分数据。但是相同的人的话只取一个,可能根据Site取或者是根据UpdateTime取。
    还有就是根据输入的条件,比如输入的条件中可能会排除掉某一Site已经有的人。

    有点说不明白,我举个例子:有的人在多个网站上登录,比如在第一个网登陆Mail 1@111.com,姓名年龄 Name1,AGE28,他又在第二个网登陆 2@111.com      Name1,AGE28。。。。现在,比如有一个网想取别的网(可能是多个网)的数据,但是自己已经有的数据是不需要的,而别的网之间的数据如果是重复的数据,就只需要取一条(根据Site取或者是根据UpdateTime取)。

    我现在的处理就是先把所有符合条件的数据取出来,然后在程序里判断,把重复的数据删除,最后再随机的取出一些数据。

    有没有什么好办法能把数据一次性从数据库里取出来,不需要在程序里判断。(DB是MySQL)















    2009年11月9日 3:55
  • 数据中能否增加一张冗余表,这张表中存唯一的用户信息。
    知识改变命运,奋斗成就人生!
    2009年11月9日 5:10
    版主
  • 数据中能否增加一张冗余表,这张表中存唯一的用户信息。
    知识改变命运,奋斗成就人生!

    还是比较麻烦的。比如已经有冗余表了,数据更新的时候处理就比较麻烦,冗余表修改比较大。

    例如:
    原来有数据
    1            1@111.com      Name1,AGE28           1      1999/01/01
    2            2@111.com      Name1,AGE28           2      1999/02/01
    3            5@111.com      Name2,AGE30           3      1999/03/01(这条数据的Mail改了一点)
    4            3@111.com      Name2,AGE30           4      1999/04/01
    5            4@111.com      Name3,AGE33           4      1999/04/01
    这时候ID1,2是一个人的数据,ID3,4是一个人的数据,ID5是一个人的数据。

    如果加入一条数据
    6            5@111.com      Name1,AGE28           4      1999/04/01

    这时候就要对原表所有的数据进行检索,判断。然后要把冗余表的ID1,2,3,4,6合成一条数据。

    如果数据变更了,比如
    ID6            5@111.com  ,Name1,AGE28变成了6@111.com ,Name6,AGE28
    这时候的处理就更复杂了。。
    2009年11月9日 5:24
  • WebConfig里追加上这个就没问题了。。
    <httpRuntime executionTimeout="36000"/>
    2009年11月9日 7:48