我试图通过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;
答案 0 :(得分:1)
Reader.Value[1]
)进行处置时,您如何期望获得第二个值("BDsize"
)?GetAsDouble
if Reader.Value[3].AsString >''
您无法将空值转换为双重if Reader.Next then
一起,您将只获得许多人的一行!请改用while
使用以下SELECT
可获得4列
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;