'System.StackOverflowException' 发生在 System.Data.SqlServerCe.dll

'System.StackOverflowException' occurred in System.Data.SqlServerCe.dll

我正在使用 SQL CE 4.0 并且当 SqlCeDataAdapter 尝试 Fill 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,393uniqueidentifier 类型的值。

执行该查询应该 return 结果是数据库中的一对一行。相反,会发生 WhosebugException。我觉得我 运行 面临某种 SQL CE 4.0 限制。


我已阅读 Understanding Databases (SQL Server Compact) > Database Objects 并且在 Queries 部分下显示:

Characters in an SQL statement    |    Unlimited

1,068,369个字符少于unlimited通过.


我已阅读 DataTable Class 并且在 备注 部分下显示:

The maximum number of rows that a DataTable can store is 16,777,216

27,393行小于16,777,216通过.


还有什么我想念的吗?

这听起来像是您的 sql 服务器 运行 在 运行 执行此查询时临时 space。您可以通过将查询更改为仅 return 一行而不使用 IN 语句来对此进行测试。如果这有效,则如前所述检查或要求您的 DBA 检查系统是否已分配资源给 运行 查询并在 return 将其发送到您的应用程序之前构建结果集。 PS。如果多人同时使用这个应用程序,那么这个问题将会非常严重。

"The code is pretty standard" (!) - 但 SQL 语句不是! 这显然是一个引擎 bug/doc 错误,但不要期望 Microsoft 会提供修复。 您将不得不更改代码以处理较小批次的 ID,从而生成一个大小不超过 1 MB 且包含 27.000 个值的语句。