SYSTABLES table 中的 ROWCOUNT 字段在删除行后未更新

ROWCOUNT field in SYSTABLES table not updated after rows have been deleted

我使用 SYSTABLES 中的 ROWCOUNT 字段从使用 Oledb 的 .NET 应用程序中快速获取我所有 table 的行数(我不想使用查询来获取它,因为它需要太多大tables).

问题是:从 table 中删除行后,SYSTABLES 中的 ROWCOUNT 数字没有更新。我测试了一些命令,甚至发现 SqlTalk 中的 运行 ROWCOUNT TABLENAME 可以工作并且速度非常快,但是如果我尝试使用 OLEDB 将其作为 .NET 的查询调用它,它什么都不返回,示例代码:

using (var connection = ConnectionFactory.CreateConnection(NombreBaseModelo))
{
    using (OleDbCommand cmd = connection.CreateCommand())
    {
        foreach (Tabla ot in LstTables)
        {
            cmd.CommandType = CommandType.Text;
            cmd.CommandTimeout = 5000;
            cmd.CommandText = "ROWCOUNT " + ot.NAME;
            var sRet = cmd.ExecuteScalar();
            ot.ROWCOUNT = int.Parse(sRet);
        }
    }
}

有什么方法可以告诉 SqlBase 为 systables 中的每个 table 更新行数?

或者作为替代方案,是否有任何方法可以使此代码正常工作?

谢谢!

systables.rowcount只有在更新统计完成后才会更新,所以不保证准确,直到你执行'Update Statistics on table ' + ot.NAME; 然后就是.

快速计算行数时可能不是您想要的。

您的 'ot.NAME' 变量是否包含 table 所有者?通常是 'SYSADM.' 您是否检查了 'sRet' 中返回的值,因为它的 'int.Parse(sRet)' 可能失败了。 否则在 PK 上创建索引并执行 COUNT(*) 。如果正在使用索引,应该和 ROWCOUNT 一样快。

或者,编写一个 SQLBase 函数或存储过程,它只在本机执行 ROWCOUNT 命令和 returns 正确的计数(根据 SQLTalk),然后从您的 Net 应用程序中调用它