0

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

问题是:从表中删除行后,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 中每个表的 Rowcount?

或者作为替代方案,有什么方法可以使这段代码工作?

谢谢!

4

1 回答 1

1

systables.rowcount 仅在更新统计信息完成后才会更新,因此不能保证准确,直到您执行 'Update Statistics on table' + ot.NAME; 然后就是。

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

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

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

于 2020-08-21T07:17:43.103 回答