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

时间:2015-11-20 16:09:57

标签: delphi ms-access database-schema delphi-xe5

在打开之前我需要RcordCount的{​​{1}}。所以我运行这个查询:

TADOTable

但这需要9.7秒(平均10次运行)在我的电脑上占用超过500万条记录的表格。与偶然触摸具有此大小的表相比,这一次似乎没有什么,但我认为这种数据应该存储在.mdb文件中的某个位置。有没有其他方法可以直接从文件中获取表的RecordCount? 我正在使用Delphi XE-5,该文件是Microsoft Access 2003格式。

3 个答案:

答案 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;会这样做。