如何获取存储在 Access .MDB 文件中的 table 的记录数?

How to get number of records of a table stored in an Access .MDB file?

我需要 TADOTableRcordCount 打开它。所以我 运行 这个查询:

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;