1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| Type
TTableStats = record
CatalogName : string;
SchemaName: string;
TableName: string;
NonUnique: boolean;
IndexQualifier : string;
IndexName: string;
StatsType: SmallInt;
OrdinalPosition : smallint;
ColumnName: string;
AscendingSort : Boolean;
Cardinality : Integer;
Pages : Integer;
FilterCondition: string;
end;
private
FTableStats: array of TTableStats;
function GetStatsTable(Index: integer): TTableStats;
public
function GetTableStats(sTableName : String; TypeIndex : Integer): boolean;
function GetTableStatsSize : Integer;
implementation
function TOdbcConnexion.GetTableStatsSize : Integer;
begin
Result := Length(FTablestats);
end;
// Stats des tables
function TOdbcConnexion.GetTableStats(sTableName : String; TypeIndex : Integer): boolean;
var
OdbcStmt: SQLHANDLE;
I: integer;
ResultCode: SQLReturn;
function GetString(ColumnNumber: integer): string;
var
iRet: integer;
sRetour: array[0..64000] of char;
begin
Result := '';
if SQLSUCCEEDED(SQLGetData(OdbcStmt, ColumnNumber, SQL_C_CHAR,
@sRetour[0], sizeof(sRetour), iRet)) then
Result := Copy(sRetour, 1, min(sizeof(sRetour), iRet));
end;
function GetInteger(ColumnNumber: integer): integer;
var
iRet: integer;
begin
Result := 0;
iRet := SizeOf(integer);
if not(SQLSUCCEEDED(SQLGetData(OdbcStmt, ColumnNumber, SQL_C_SLONG, @Result, 0, iRet))) then
Result := 0;
end;
begin
SetLength(FTableStats,0);
if not (FIsConnect) then
begin
FErrorMessage := cOdbc_No_Execute;
Result := False;
Exit;
end;
SQLAllocHandle(SQL_HANDLE_STMT, fHdbc, OdbcStmt);
FCnxResultCode := SQLStatistics(OdbcStmt, nil, 0, nil, 0, PAnsichar(sTableName),
Length(sTableName), TypeIndex, SQL_ENSURE);
FErrorMessage := GetErrorMessage(SQL_HANDLE_DBC, FHDbc, FCnxResultCode);
Result := FErrorMessage = '';
if not Result then
begin
SQLFreeHandle(SQL_HANDLE_STMT, OdbcStmt);
Exit;
end;
I := 0;
ResultCode := SqlFetch(OdbcStmt);
while SQLSUCCEEDED(ResultCode) do
begin
Inc(I);
SetLength(FTablestats, I);
with FTableStats[I - 1] do
begin
CatalogName := GetString(1);
SchemaName:= GetString(2);
TableName:= GetString(3);
NonUnique:= GetString(4) = '1';
IndexQualifier := GetString(5);
IndexName:= GetString(6);
StatsType:= GetInteger(7);
OrdinalPosition := GetInteger(8);
ColumnName := GetString(9);
AscendingSort := GetString(10) = 'A';
Cardinality := GetInteger(11);
Pages := GetInteger(12);
FilterCondition:= GetString(13);
end;
ResultCode := SqlFetch(OdbcStmt);
end;
SQLFreeHandle(SQL_HANDLE_STMT, OdbcStmt);
end;
// Retourne un TTableStats
// (privée)
function TOdbcConnexion.GetStatsTable(Index: integer): TTableStats;
begin
Result := FTableStats[Index];
end; |
Partager