Programowanie w języku Delphi » Gotowce

Obsługa SQL w aplikacji

  • 2010-03-26 11:34
  • 5 komentarzy
  • 1233 odsłony
  • Oceń ten tekst jako pierwszy
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 (8,24 KB)

5 komentarzy

Juhas 2010-03-26 11:35

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.

Juhas 2009-05-14 16:09

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

areksum 2009-05-14 13:57

<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ą)

Juhas 2009-05-13 17:35

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.

areksum 2009-05-13 12:26

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