ISAPI

0

Napisałem aplikację do obsługi formularzy ze stron HTML. Wszystko działało poprawnie do momentu gdy spróbowałem przesłane dane zapisać do bazy. Tak prawde mówiąc to problem powstaje nie przy samym zapisie, ale przy próbie połączenia z bazą.
Serewer www (Personal Web Server) wywala nr błędu 500 (błąd skryptu). Serwer bazy danych to Interbase.
Gdy podobny kod umieściłem w zwykłej aplikacji to wszystko działa poprawnie.
Pomocy!

0

Ciezko jest okreslic blad; blad 500 moze byc spowodowany wieloma czynnikami - np. zle operacje na pamieci, wskazniki, konfiguracja samego serwera. Program ISAPI uruchamiasz na swoim serwerze (localhost) ?

Sczerze mowiac jezeli chdozi o bazy danych w ISAPI korzystalem jedynie z BDE. Z Repozytorium wybralem Web Server Aplication.

Moduł TWebModule zezwoli na umieszczanie na naszym formularzu niewidocznych komponentów służących do obsługi baz danych. Obsługa takiej bazy danych jest identyczna ze zwyczajnym obsługiwaniem komponentów BDE. Różnica uwidacznia się tym, że konieczne jest samodzielne napisanie funkcji odczytujących rekordy z bazy danych. Następnie takie rekordy muszą być zapisane w formie tabeli HTML.
Na formularzu musisz więc umieścić jedynie komponent TTable — to wystarczy. Przed kompilacją projektu z właściwości DatabaseName wybierz bazę danych — np. MojaBaza. Z listy właściwości TableName wybierz MainTable. Kod źródłowy modułu ISAPI przedstawiony jest ponizej:

unit MainFrm;

interface

uses
SysUtils, Classes, HTTPApp, HTTPProd, DB, DBTables;

type
TWebModule1 = class(TWebModule)
Table: TTable;
procedure WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
WebModule1: TWebModule1;

implementation

{$R *.dfm}

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
HTML : TStringList;
begin
HTML := TStringList.Create;
try
{ tworzenie początku szablonu }
HTML.Add('');
HTML.Add('');
HTML.Add('Odczyt z baz danych');
HTML.Add('');
HTML.Add('');
HTML.Add(''); // tworzenie tabeli
HTML.Add('IDTowarCenaData');

Table.Active := True;

{ kolejno odczytywanie następnych rekordów i dodawanie ich do rezultatu HTML }
while not Table.Eof do
begin
  HTML.Add('');
  HTML.Add(` + IntToStr(Table.FieldValues['id']) + `);
  HTML.Add(` + Table.FieldValues['Towar'] + `);
  HTML.Add(` + FloatToStr(Table.FieldValues['Cena']) + `);
  HTML.Add(` + DateTimeToStr(Table.FieldValues['Data']) + `);  
  HTML.Add('');
  Table.Next;
end;    

HTML.Add('');

Table.Active := False;
HTML.Add('');
HTML.Add('');

Response.Content := HTML.Text;
Handled := True;

finally
HTML.Free;
end;
end;

end.

To tylko odczyt - zapis realizowany jest tak samo jak w zwyklych aplikacjach BDE. Moze wiec zdecydujesz sie na skorzystanie z BDE ;)

0

Dzięki za odpowiedź

Trochę mało dokładnie sprecyzowałem poprzednie pytanie. Program uruchamiam na loklnym serwerze (Personal Web Server).
Budowę aplikacji rozpoczynam w dokładnie ten sam sposób. Wybieram komponent typu TTable lub TQuery, wybieram w DatabaseName zdefiniowany alias do bazy.

Zaobserwowałem, że program wylatuje w momencie ustawiania wartości pola Active na true. :-[

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