2011-02-23 46 views
0

你好 我正在开发一个c#应用程序,用于选择和比较数据库上的一些数据,有超过500'000条记录的表上。我正在使用mysql连接器,并且我将要做一个:哪个是mysql中用c#可选择的最大行数?

SELECT * FROM table 

从那张表中。 我的问题是:建议使用select * without limit?如果我一次选择所有500000条记录,这个过程是否会产生问题,或者我应该限制用户选择组中的记录? 我问,因为在VB中,我遇到了这种选择的问题,使停止程序。

谢谢大家。

编辑:我选择功能:

public Object[] QuerySelect(String query) 
{ 
    IDbCommand dbcmd = dbcon.CreateCommand(); 
    dbcmd.CommandText = query; 

    IDataReader reader= dbcmd.ExecuteReader(); 
    ArrayList result = new ArrayList(); 

    while (reader.Read()) 
    { 
     Hashtable ht = new Hashtable(); 
     int fieldCount = reader.FieldCount; 

     for (int i = 0; i < fieldCount; i++) 
      ht.Add(reader.GetName(i), reader[i]); 

     result.Add(ht); 
    } 
    reader.Close(); 

    return result.ToArray(); 
} 
+0

嗨,如果你准确地解释你想要做什么,你可以得到好的想法,如何正确地做到这一点,丹尼尔是正确的DataReader会比一次加载数据集上的一切,但我相信如果某些逻辑可以放在存储过程中,或者可以使用滑动窗口方法完成,那就更好了。 – 2011-02-23 11:33:23

+0

我必须阅读这些行,并且对于每一行我都必须检查一些值,然后在特定条件下更新此值。我不需要查看这个结果,只需处理它们,在命令Promt应用 – albanx 2011-02-23 11:49:19

回答

1

我想你使用SqlCommand.ExecuteReaderSqlDataReader读取数据。在这种情况下,它本身不是一个问题,因为你会在循环中请求每一行。但是,如果您通过阅读所有行并将结果放入列表中,那么会出现问题,因为您试图将这500,000个项目放入内存中。

如果你不把行放在一个列表中,而是以某种方式处理它们,所以它们可以被垃圾回收后,你没有问题。

更新:
您更新了您的问题并显示了您正在使用的方法。这正是这种情况,会让你陷入困境,因为它会导致一个包含500,000个Hastable实例的ArrayList实例。

答案:
现在你应该使用泛型, List<T>Dictionary<TKey, TValue>而不是ArrayList和Hashtable。它使你的代码类型安全。

+0

是的,我使用它们,然后我把结果放在列表中 – albanx 2011-02-23 11:51:10

+0

目前我在查询中使用LIMIT。 – albanx 2011-02-25 07:28:21

0

这是由您来解决问题,不要强迫用户拆分表或减少记录数。

尝试阅读您感觉舒适的窗户尺寸,并将其纳入您的性能规格。例如,每次读取100,000条记录,处理它们,然后存储它们并获得下一组100.000。