如何获取存储在 Access .MDB 文件中的 table 的记录数?
How to get number of records of a table stored in an Access .MDB file?
我需要 TADOTable
的 RcordCount
打开它。所以我 运行 这个查询:
ADOQuery1.SQL.Text := ‘SELECT Count(*) AS Record_Count FROM Table1’;
ADOQuery1.Open;
但是对于包含超过 500 万条记录的 table,在我的 PC 上这需要 9.7 秒(平均 10 运行 秒)。与甚至触摸具有这种大小的 table 相比,这一次似乎没什么,但我认为这种数据应该存储在 .mdb 文件中的某个位置。有没有其他方法可以直接从文件中获取 table 的 RecordCount?
我使用的是 Delphi XE-5,文件是 Microsoft Access 2003 格式。
不,SELECT Count(*)
是唯一正确的方法。
但是: 将近 10 秒的查询速度非常慢,尤其是在您的本地 PC 上。
table 有主键吗?如果是,它是什么数据类型?
我创建了一个带有自动编号主键的简单 table 并插入了 500 万条记录。
SELECT COUNT(*) FROM tBig
执行时间不到 1/10 秒。
我同意 Andre451 的观点。我要说的另一件事是,您应该在 Count 语句中指定字段,而不是使用 *.
SELECT COUNT(PrimaryKey) FROM tBig;
会做的。
嗯,我多搜索了一下,找到了。您可以直接从架构中读取 table 的记录数:
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;
我需要 TADOTable
的 RcordCount
打开它。所以我 运行 这个查询:
ADOQuery1.SQL.Text := ‘SELECT Count(*) AS Record_Count FROM Table1’;
ADOQuery1.Open;
但是对于包含超过 500 万条记录的 table,在我的 PC 上这需要 9.7 秒(平均 10 运行 秒)。与甚至触摸具有这种大小的 table 相比,这一次似乎没什么,但我认为这种数据应该存储在 .mdb 文件中的某个位置。有没有其他方法可以直接从文件中获取 table 的 RecordCount? 我使用的是 Delphi XE-5,文件是 Microsoft Access 2003 格式。
不,SELECT Count(*)
是唯一正确的方法。
但是: 将近 10 秒的查询速度非常慢,尤其是在您的本地 PC 上。
table 有主键吗?如果是,它是什么数据类型?
我创建了一个带有自动编号主键的简单 table 并插入了 500 万条记录。
SELECT COUNT(*) FROM tBig
执行时间不到 1/10 秒。
我同意 Andre451 的观点。我要说的另一件事是,您应该在 Count 语句中指定字段,而不是使用 *.
SELECT COUNT(PrimaryKey) FROM tBig;
会做的。
嗯,我多搜索了一下,找到了。您可以直接从架构中读取 table 的记录数:
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;