Obsługa SQL w aplikacji
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 (8,24 KB)
5 komentarzy
Hmmm i na pewno nie ma szans, żeby dostać coś innego niż to, co się własnoręcznie zainsertowało?
<quote>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.</quote>
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()
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.