System.Data.SqlServerCe.dll

时间:2016-05-26 22:25:40

标签: c# ado.net sql-server-ce sql-server-ce-4

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

还有其他我不想要的东西吗?

2 个答案:

答案 0 :(得分:1)

“代码非常标准”(!) - 但SQL语句不是! 这显然是一个引擎错误/文档错误,但不要指望微软的修复。 您将不得不更改代码以使用较小批量的ID,从而产生一个大小不是1 MB且具有27.000个值的语句。

答案 1 :(得分:0)

这听起来像运行此查询时sql server耗尽临时空间。您可以通过更改查询以仅返回一行而不使用IN语句来测试此操作。如果这有效,那么如前所述检查或要求您的DBA检查系统是否已分配资源来运行查询并构建结果集,然后再将其返回给您的应用程序。 PS。如果多人同时使用此应用程序,那么这个问题将会出现可怕的扩展。