当 SqlCeDataAdapter 尝试填充时,我正在使用 SQL CE 4.0 并遇到 StackOverflowException DataTable 。
代码非常标准:
using (var cmd = new SqlCeCommand(sql, conn, tran))
using (var dt = new DataTable())
{
using (var da = new SqlCeDataAdapter(cmd))
da.Fill(dt);
IList<DataRow> rows = dt.Rows.OfType<DataRow>().ToList();
foreach (DataRow row in rows)
{
// Processing ...
}
}
sql
字符串的格式为:
SELECT * FROM [Table] WHERE Id IN ( ... )
由于列值列表中填充了1,068,369
类型27,393
的值,因此总字符数为uniqueidentifier
。
执行该查询应返回数据库中1对1行的结果。而是发生 StackOverflowException 。我觉得我正在遇到某种 SQL CE 4.0 限制。
我已阅读Understanding Databases (SQL Server Compact) > Database Objects,并在查询部分下面显示:
SQL语句中的字符|无限
1,068,369
个字符小于unlimited
;的 PASS
我已阅读DataTable Class,并在备注部分下面写着:
DataTable可以存储的最大行数 16,777,216
27,393
行小于16,777,216
;的 PASS
还有其他我不想要的东西吗?
答案 0 :(得分:1)
“代码非常标准”(!) - 但SQL语句不是! 这显然是一个引擎错误/文档错误,但不要指望微软的修复。 您将不得不更改代码以使用较小批量的ID,从而产生一个大小不是1 MB且具有27.000个值的语句。
答案 1 :(得分:0)
这听起来像运行此查询时sql server耗尽临时空间。您可以通过更改查询以仅返回一行而不使用IN语句来测试此操作。如果这有效,那么如前所述检查或要求您的DBA检查系统是否已分配资源来运行查询并构建结果集,然后再将其返回给您的应用程序。 PS。如果多人同时使用此应用程序,那么这个问题将会出现可怕的扩展。