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
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?
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
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()