Obsługa SQL w aplikacji

Juhas

Wersja 1.2

Klasa TSQLManager ułatwia wykonywanie zapytań SQL z poziomu aplikacji. Zawiera wszystkie potrzebne do tego metody(a nawet więcej). Poza tym zabezpiecza aplikację przed restartem serwera. Jeśli serwer zostanie zrestartowany w trakcie działania aplikacji, to wszystko nadal będzie działać!

Do klasy dołączona jest pseudo dokumentacja. Jest to plik txt z przykładami, a także opisaną każdą metodą i właściwością. Jeśli komuś się chce i ma czas, byłbym wdzięczny za przerobienie tej dokumentacji do pliku HTML :)

Poniżej umieszczam listę metod publicznych:

constructor Create(ADOConnection: TADOConnection);
destructor Destroy; override;

function ExecuteQuery(Query: string; Connection: TADOConnection = nil; MessageOnError: boolean = true): boolean;

function ExecuteQueryWithVal(Query: string; Connection: TADOConnection = nil; MessageOnError: boolean = true): Variant;

function ExecuteQueryWith2Vals(Query: string; var Val1: Variant; var Val2: Variant; Connection: TADOConnection = nil; MessageOnError: boolean = true): boolean;

function ExecuteQueryWithArray(Query: string; var ResultArray: TArrayOfString; FieldNames: array of string; Connection: TADOConnection = nil; MessageOnError: boolean = true): boolean;

function ExecuteQueryWithValArray(Query: string; var ResultArray: TArrayOfString; Connection: TADOConnection = nil; MessageOnError: boolean = true): boolean; overload;

function ExecuteQueryWithValArray(Query: string; var ResultArray: TArrayOfInteger; Connection: TADOConnection = nil; MessageOnError: boolean = true): boolean; overload;

function ExecuteQueryList(Query: string; ListFieldName: string; List: TStrings; ListFieldValName: string = ''; ConListFieldName: string = ''; Connection: TADOConnection = nil; MessageOnError: boolean = true): boolean;

function QueryToAdo(Query: string; var ADO: TADOQuery; Connection: TADOConnection = nil; MessageOnError: boolean = true): boolean;

function FieldValueExists(TableName: string; FieldName: string; FieldValue: string; Condition: string = ''; IDFieldName: string = 'ID'): integer; overload;

function FieldValueExists(TableName: string; FieldName: string; FieldValue: integer; Condition: string = ''; IDFieldName: string = 'ID'): integer; overload;

function IsValueInDataset(Value: Variant; FieldName: string; Dataset: TAdoQuery): boolean;

function GetLastInsertID(TableName: string): integer;

function Aggregate(FunctionName, TableName, FieldName: string; Condition: string = ''): Double;

procedure Reconnect;

procedure BeginTransaction;
procedure CommitTransaction;
procedure RollbackTransaction;

procedure GetTableNames(Names: TStrings; MessageOnError: boolean);
function GetRecordCount(TableName: string): integer;

function GetLastError: string;

Co nowego

  • dodano metody: Begin(Commit, Rollback)Transaction, GetTableNames, GetRecordCount, GetLastError
  • dodano zdarzenie OnSQLProgress, dzięki któremu można wyświetlić użytkownikowi progressBara podczas niektórych operacjiSQLManager.zip

5 komentarzy

Jest już nowy plik, zachęcam do pobierania i używania. W razie jakiś pytań lub wątpliwości najlepiej pisać do mnie na maila.

Hmmm i na pewno nie ma szans, żeby dostać coś innego niż to, co się własnoręcznie zainsertowało?

no to też dostanę zły wynik, jeśli w tabeli do której robimy insert jest założony trigger(AFTER_INSERT), który dodaje rekord do innej tabeli.

z funkcję scope_identity jest właśnie tak, że dostaniemy id dodane przez nas (a ściślej id wygenerowane w zakresie naszego połączenia z bazą)

Może to być prawda. Jednak chodziło mi o pobranie ID z konkretnej tabeli. Bo jeśli użyłbym scope_identity lub samo @@IDENTITY, no to też dostanę zły wynik, jeśli w tabeli do której robimy insert jest założony trigger(AFTER_INSERT), który dodaje rekord do innej tabeli.

Tak więc można posługiwać się tą funkcją, lub jak kto woli wykonać odpowiednie zapytanie :)
To już zależy od programisty i od struktury bazy danych. Czy takie rzeczy mogą wystąpić, czy nie.

Mam ponure wrażenie, że metoda

function GetLastInsertID(TableName: string): integer;

ma swobodę zadziałania niezgodną z intencjami autora. Domyślam się że chodzi o zachowanie relacji w stylu nagłówek faktury-pozycje...
otóż buractwo zacznie kiełkować kiedy dwie osoby jednocześnie zaczną wprowadzać dokument do tych samych tabel. W momencie kiedy pierwsza osoba zapisze swój nagłówek w tabelce nagłówków i zechce pobrać GetLastInsertID('DOK_NAG') to nawet się nie zorientuje, że pobiera ID nagłówka drugiej osoby, która moment po niej też zapisała swój nagłówek :)
Jeśli odgadłem intencje autora, to buraki porastają funkcję ident_current('nazwa_tabeli') użytą właśnie w GetLastInsertID. Chcemy ostatnio przez nas dodane id, a to bydle zwraca ostatnio dodane id we wskazanej tabeli, nieważne przez kogo.
Należało by użyć scope_identity()