'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,393
个 uniqueidentifier
类型的值。
执行该查询应该 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 个值的语句。
我正在使用 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,393
个 uniqueidentifier
类型的值。
执行该查询应该 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 个值的语句。