【问题标题】:C# SqlDataAdapter failing with large databaseC# SqlDataAdapter 因大型数据库而失败
【发布时间】:2013-11-24 16:26:01
【问题描述】:

这是我的代码,它可以正常工作,直到我的数据库在主表中的记录不超过 20000 条。当 DB 到大程序时,在语句 da.Fill(data) 处冻结。没有异常抛出,程序只是停止工作。我能做什么?

DataTable data = new DataTable();
SqlCeCommand cmd = new SqlCeCommand();
SqlCeDataAdapter da = new SqlCeDataAdapter();

cmd = new SqlCeCommand("SELECT DISTINCT * FROM ((Osoba AS a LEFT OUTER JOIN Doswiadczenie AS b ON a.HashId = b.Hashid) LEFT OUTER JOIN Wyksztalcenie AS c on a.HashId = c.HashId) INNER JOIN Uczelnia as d ON c.UczelniaId = d.UczelniaId WHERE a.DataOstOdczytu >= @minDate AND a.DataOstOdczytu <= @maxDate AND b.DataOdczytu >= @minDate AND b.DataOdczytu <= @maxDate AND c.DataOdczytu >= @minDate AND c.DataOdczytu <= @maxDate", this.Connection);

cmd.Parameters.Add(new SqlCeParameter("@minDate", minDate));
cmd.Parameters.Add(new SqlCeParameter("@maxDate", maxDate));

da.SelectCommand = cmd;
try
{
    da.Fill(data);
}
catch (System.Data.SqlServerCe.SqlCeException)
{
    throw;
}

return data;

【问题讨论】:

  • 尝试逐行获取而不是 da.Fill(data)
  • 使用数据阅读器以获得更好的性能。一般紧凑的 sql 记录很多,速度很慢。
  • DataAdapter.Fill too slow 的可能重复项
  • 查询是否在合理的时间内自行(在程序外部)对大量行进行处理?如果您有大行,“Distinct *”肯定需要进行大量排序。
  • 查看 CodeCaster 的链接。

标签: c# fill sqldataadapter


【解决方案1】:

catch 块中创建 System.Data.SqlServerCe.SqlCeException exname 的对象,而不是 throw 写入 Console.WriteLine(exname.Message) 以确认没有异常。

【讨论】:

  • catch 块已经重新抛出异常......这实际上使 catch 块变得多余。
  • 我们可以通过打印来确认我们是否得到异常。
  • @Raptor 调试显然是一个更好的选择,如果你想检查你是否得到任何异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
相关资源
最近更新 更多