我使用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吗?
或者作为替代方案,有什么方法可以让这个代码工作吗?
谢谢!
systables.rowcount只有在更新统计信息时才会更新,因此在执行"更新表上的统计信息"+ot之前,它不能保证准确。名称;那就是。
在快速计算行数时可能不是您想要的。
您的"ot.NAME"变量是否包含表所有者?通常是它的"SYSADM"您是否检查了"sReset"中返回的值,因为它的"int.Parse(sReset("可能失败了。否则,在PK上创建索引并执行COUNT(*(。如果正在使用索引,则应该与ROWCOUNT一样快。
或者,编写一个SQLBase函数或存储过程,只在本机执行ROWCOUNT命令并返回正确的计数(根据SQLTalk(,然后从您的Net应用调用它