在打开之前我需要RcordCount
的{{1}}。所以我运行这个查询:
TADOTable
但这需要9.7秒(平均10次运行)在我的电脑上占用超过500万条记录的表格。与偶然触摸具有此大小的表相比,这一次似乎没有什么,但我认为这种数据应该存储在.mdb文件中的某个位置。有没有其他方法可以直接从文件中获取表的RecordCount? 我正在使用Delphi XE-5,该文件是Microsoft Access 2003格式。
答案 0 :(得分:3)
不,SELECT Count(*)
是唯一且正确的方法。
但是:此查询的差不多10秒非常慢,特别是如果这是在您的本地PC上。
表格是否有主键?如果是,它是什么数据类型?
我创建了一个带有自动编号主键的简单表,并插入了500万条记录
SELECT COUNT(*) FROM tBig
执行时间不到1/10秒。
答案 1 :(得分:1)
好吧,我再搜索了一下然后找到了它。您可以直接从架构中读取表的记录数:
function ReadRecordCountFromSchema(const Connection: TADOConnection;
const TableName: string): Integer;
var
CardinalityField,
NameField: TField;
DataSet: TADODataSet;
begin
DataSet := TADODataSet.Create(nil);
Result := -1;
try
Connection.OpenSchema(siStatistics, EmptyParam, EmptyParam, DataSet);
CardinalityField := DataSet.FieldByName('CARDINALITY'); { do not localize }
NameField := DataSet.FieldByName('TABLE_NAME'); { do not localize }
while not DataSet.EOF do
begin
if CompareText(NameField.AsString, TableName) = 0 then
begin
Result := CardinalityField.AsInteger;
Break;
end;
DataSet.Next;
end;
finally
DataSet.Free;
end;
end;
实际上TADOConnection.GetTableNames
给了我这个想法。
修改强>:
正如Andre451所提到的,最好将TableName
传递给OpenSchema
作为限制:
function ReadRecordCountFromSchema(const Connection: TADOConnection;
const TableName: string): Integer;
var
DataSet: TADODataSet;
begin
DataSet := TADODataSet.Create(nil);
Result := -1;
try
Connection.OpenSchema(siStatistics,
VarArrayOf([Unassigned, Unassigned, TableName]),
EmptyParam, DataSet);
if DataSet.RecordCount > 0 then
Result := DataSet.FieldByName('CARDINALITY').AsInteger;
finally
DataSet.Free;
end;
end;
答案 2 :(得分:0)
我同意Andre451。我要说的唯一另一件事是你应该在Count语句中指定字段而不是使用*。
SELECT COUNT(PrimaryKey) FROM tBig;
会这样做。