IBStoredProc wywala błąd w pewnych okolicznościach...

0

Cześć, najpierw przedstawię po krótce sytuację programu:

Jest serwer i kilku klientów.
Na serwerze jest główna baza danych(Firebird), a także działający w tle mały programik, nazwijmy go ORG.

Każdy z klientów ma u siebie awaryjną bazę danych(struktura taka sama, jak w głównej).

Całość działa tak:
Klient wysyła jakieś zapytanie do głównej bazy i jest ono wykonane. Zapytanie to potem przechwytuje ORG i rozsyła do baz awaryjnych wszystkich klientów.
To działa ok.

Problem pojawia się przy procedurach składowanych.

Gdy jakiś klient odpala procedurę składowaną, wysyła do ORG pewien łańcuch. Znajdują się w nim informacje takie jak: nazwa procedury składowanej, nazwa 1 parametru, typ pierwszego parametru(DataType), wartość 1 parametru, nazwa 2 parametru....itd

Następnie ORG wydobywa z tego łańcucha wszystkie informacje i pakuje je do StringList, a następnie ładuje je do IBStoredProc w taki sposób:

StoredProc.StoredProcName:=sl.strings[0];
sl.Delete(0);

while sl.Count>0 do
begin
  param:=TParam.Create(nil);
  param.Name:=sl.Strings[0];
  param.Value:=Variant(sl.strings[2]);
  param.DataType:=StrToFieldType(sl.Strings[1]);
  storedProc.Params.AddParam(param);
  for i:=1 to 3 do sl.Delete(0);
end;

Patrzyłem i wszystko się ładuje do tego SP tak, jak powinno. StrToFieldType to po prostu moja funkcja, która zamienia stringa np: 'ftLargeInt' na wartość typu FieldType - ftLargeInt

Oczywiście StoredProc jest połączone z bazą awaryjną klienta(na której procedura składowana jest).
Dostaję jednak błąd:

Błąd przy wykonywaniu procedury składowanej: Dynamic SQL Error
SQL error code = -104
Unexpected end of command - line 1, column 44

(zaznaczam, że jak procedura jest wykonywana przez program, gdzie StoredProc nie jest tworzone dynamicznie i sam sobie pobiera parametry, to jest ok).

O co może mu chodzić?

0

Witam !

Nie wiem, czy mam rację, ale zamiast tych kombinacji możesz utworzyć plik "cienia" bazy danych w dowolnej lokalizacji i wtedy serwer automatycznie będzie dokonywał aktualizacji tego pliku bez ingerencji z zewnątrz (bez Twojej wiedzy). Będziesz miał zawsze aktualną kopię bazy.

Pozdrówko !

0
jw_software napisał(a)

Witam !

Nie wiem, czy mam rację, ale zamiast tych kombinacji możesz utworzyć plik "cienia" bazy danych w dowolnej lokalizacji i wtedy serwer automatycznie będzie dokonywał aktualizacji tego pliku bez ingerencji z zewnątrz (bez Twojej wiedzy). Będziesz miał zawsze aktualną kopię bazy.

Pozdrówko !

A wiesz, jak coś takiego zrobić?
Przypominam, że zmiany w kilku bazach jednocześnie ;)

0

Witam !

Musisz poszukać w dokumentacji Interbase-a gdyż nie pamietam dokładnie w tej chwili całej składni.
Jest takie polecenie CREATE SHADOW <ID> <PLIK>.
Przykładowo : CREATE SHADOW 1 'C:\DANE.SHD' tworzy w podanej lokalizacji plik "cienia" bazy danych o identyfikatorze 1. Od tego momentu wszystko co się będzie działo w bazie danych będzie się również działo w pliku "cienia" bazy. Identyfikator musi być unikalny. Aby usunąć ten plik wykonujemy
DROP SHADOW 1

Pozdrówko !

0

No ładnie to wygląda do momentu:
"Shadow files are not normally used on Windows platforms, as the shadow file has to be on the same computer as the active database."

1 użytkowników online, w tym zalogowanych: 0, gości: 1