如何通过TDBXReader获取数据库大小?

时间:2014-11-30 21:22:46

标签: mysql delphi

我试图通过TDBXReader获取数据库的大小。我的命令SQL返回两行,我的数据库大小和所有数据库大小的总和。

我试图使用Reader.Value [0]来获取数据库之和的值并获取错误TDBXTypes.BCD值类型不能被访问为TDBXTypes.Doubletype。

如果我使用Reader.Value [1]得到'无效序数= 1'

功能:

function ChangeBD() : double;
var
  Con : TDBXConnection;
  Cmd : TDBXCommand;
  Reader :  TDBXReader;
begin
  Result:= 0;
  Con := TDBXConnectionFactory.GetConnectionFactory.GetConnection('mydb', 'root', 'root');
  Cmd := Con.CreateCommand;
  Cmd.Text := 'SELECT Sum(data_length + index_length) / 1024 / 1024 "BDsize" FROM information_schema.tables WHERE table_schema = '+quotedstr('mydb');

  Reader := Cmd.ExecuteQuery;

  if Reader.Next then
    begin
      Result:= Reader.Value[0].GetDouble;
    end
  else

  Con.Free;
  Cmd.Free;
  Reader.Free;

end;

1 个答案:

答案 0 :(得分:1)

  • 当您只放置一个数据字段(Reader.Value[1])进行处置时,您如何期望获得第二个值("BDsize")?
  • 使用GetAsDouble
  • 执行测试if Reader.Value[3].AsString >''您无法将值转换为双重
  • if Reader.Next then一起,您将只获得许多人的一行!请改用while

使用以下SELECT可获得4列

  • table_name,[0]
  • data_length,[1]
  • index_length,[2]
  • total_size,[3]

var
sum : double;

[...]

Cmd := Con.CreateCommand;
Cmd.Text := 'SELECT table_name, '+
            'round( data_length / ( 1024 *1024 ) , 2 ) data_length, '+
            'round( index_length / ( 1024 *1024 ) , 2 ) index_length, '+
            'round( round( data_length + index_length ) / ( 1024 *1024 ) , 2 ) total_size '+
            'FROM information_schema.TABLES '+
            'WHERE table_schema = ''mydb'' ';

Reader := Cmd.ExecuteQuery;

GetAsDouble

function ChangeBD() : double;
[...]
while Reader.Next do
   begin
    if Reader.Value[3].AsString > '' 
       then sum := sum + Reader.Value[3].GetAsDouble;
   end
Result:= sum;

或者做自己的总和;

function ChangeBD() : double;
[...]
while Reader.Next do
   begin
    if Reader.Value[3].AsString > '' 
       then sum := sum + StrToFloat(Reader.Value[3].AsString) ;
   end
Result:= sum;