2014-11-30 2 views
1

Я пытаюсь получить размер моей базы данных через TDBXReader. Моя команда SQL возвращает две строки, размер моей базы данных и сумму всех размеров базы данных.Как получить размер базы данных через TDBXReader?

Я пытаюсь использовать Reader.Value [0], чтобы получить значение суммы базы данных и получить ошибку. Тип значения TDBXTypes.BCD не может быть реализован как TDBXTypes.Doubletype.

Если я использую Reader.Value [1] получить 'Invalid Порядковый = 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
  • Как вы можете ожидать, 2-ое значение (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; 
+0

Спасибо за отличный ответ и объяснение. GetAsDouble поможет мне. –

+0

@Artur_Indio: Рад помочь :) –

Смежные вопросы