3

財務報告を行うプロジェクトがあり、ユーザーがこのレポートをインターネット経由で取得できるようにしたい

Indy コンポーネントである TIdHTTPServer を使用して、アプリケーションを HTTP サーバーとして機能させ、できるようにしてみました

リクエスト受付→リクエスト処理→リクエスト処理結果の返信

特別なポートを使用します。

今私の問題は、スレッドの問題のように見える多くのアクセス違反エラーとランダムな例外が発生していることです。または、TIdHTTPServer を使用せずに同じ要求を処理しても問題が発生しないため、わかりません。

私は OnCommandGet イベントを使用してリクエストを処理し、結果をコンテキスト ストリーム内のユーザーに送り返しています。

私が必要としているのは、TADODataSet と TADOConnection でそれを使用する方法のデモンストレーションです。

たとえば、ユーザーがリクエストを送信できるようにする必要があり、TIdHTTPServer がリクエストを受け取ります (たとえば、ADODataSet を使用してストアド プロシージャを呼び出し、結果を XML ファイルとして受け取り、ユーザーに送り返します)。

助けてください....ありがとう。

4

1 に答える 1

3

サーバーがどのように機能するかの1つの可能性...

unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,IDContext, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer, StdCtrls, DB, ADODB;

type
  TForm3 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    Memo1: TMemo;
    Button1: TButton;
    DummyConnection: TADOConnection;
    procedure Button1Click(Sender: TObject);
    procedure IdTCPServer1Execute(AContext: TIdContext);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation
uses ComObj,AdoInt,ActiveX;
{$R *.dfm}
function SendStream(AContext: TIdContext; AStream: TStream): Boolean;
begin
   Result := False;
   try
     AContext.Connection.IOHandler.Write(AStream.Size);  // sending length of Stream first
     AContext.Connection.IOHandler.WriteBufferOpen;
     AContext.Connection.IOHandler.Write(AStream, AStream.Size);
     AContext.Connection.IOHandler.WriteBufferFlush;
   finally
     AContext.Connection.IOHandler.WriteBufferClose;
   end;
   Result := True;
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  IdTCPServer1.Active := true;
end;


{ Clientside function
Function RecordsetFromXMLStream(Stream:TStream): _Recordset;
var
  RS: Variant;
begin
    RS := CreateOleObject('ADODB.Recordset');
    RS.Open(TStreamAdapter.Create(Stream) as IUnknown);
    Result := IUnknown(RS) as _Recordset;
end;
}

Procedure RecordsetToXMLStream(const Recordset: _Recordset;Stream:TStream);
var
  RS: Variant;
begin
    if Recordset = nil then Exit;
    RS := CreateOleObject('ADODB.Recordset');
    RS := Recordset;
    RS.Save(TStreamAdapter.Create(stream) as IUnknown, adPersistXML);
    Stream.Position := 0;
end;

Procedure GetQueryStream(Const s,ConStr:String;ms:TMemoryStream);
var
 AC:TAdoConnection;
 ads:TAdodataset;
begin
 AC:=TAdoConnection.Create(nil);
 try
 ads:=TAdodataset.Create(nil);
   try
     ads.Connection := AC;
     AC.ConnectionString := ConStr;
     ads.CommandText := s;
     ads.Open;
     RecordsetToXMLStream(ads.Recordset,ms);
   finally
     ads.Free
   end;
 finally
   AC.Free
 end;

end;

procedure TForm3.IdTCPServer1Execute(AContext: TIdContext);
var
 cmd:String;
 ms:TMemoryStream;
begin
     CoInitialize(nil);
     AContext.Connection.IOHandler.Readln(cmd);
     ms:=TMemoryStream.Create;
     try
     GetQueryStream('Select * from Adressen',DummyConnection.ConnectionString,ms);
     ms.Position := 0;
     SendStream(AContext,ms);
     AContext.Connection.Socket.CloseGracefully;
     finally
        ms.Free;
        CoUninitialize;
     end;

end;
end.
于 2012-11-20T10:18:46.363 に答える