2014-02-28 2 views
2

아래에 표시된 줄에서 다음 오류가 발생합니다. 그리고 나는 왜 우리가이 오류를 겪고 있는지 알 수 없다.DataSnap 프록시 문제

Project ChirpSR.exe raised exception class $C0000005 with message 'access violation at 0x00e8d088: read of address 0x00000000'. 

아래의 코드는 DataSnap 서버에 대한 자동 생성 된 프록시 클래스에서입니다.

interface 

uses Data.DBXCommon, Data.DBXClient, Data.DBXDataSnap, Data.DBXJSON, Datasnap.DSProxy, System.Classes, System.SysUtils, Data.DB, Data.SqlExpr, Data.DBXDBReaders, Data.DBXCDSReaders, Data.DBXJSONReflect; 

.... 
type 
    TServerMethods1Client = class(TDSAdminClient) 
    private 
    FEchoStringCommand: TDBXCommand; 
    FReverseStringCommand: TDBXCommand; 
    FGetValleysCommand: TDBXCommand; 
    FUpdateUserCommand: TDBXCommand; 
    public 
    constructor Create(ADBXConnection: TDBXConnection); overload; 
    constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload; 
    destructor Destroy; override; 
    function EchoString(Value: string): string; 
    function ReverseString(Value: string): string; 
    function GetValleys: TJSONValue; 
    function UpdateUser(jsonobj: TJSONObject): Integer; 
    end; 
.... 
// This function runs fine 
function TServerMethods1Client.GetValleys: TJSONValue; 
begin 
    if FGetValleysCommand = nil then 
    begin 
    FGetValleysCommand := FDBXConnection.CreateCommand; 
    FGetValleysCommand.CommandType := TDBXCommandTypes.DSServerMethod; 
    FGetValleysCommand.Text := 'TServerMethods1.GetValleys'; 
    FGetValleysCommand.Prepare; 
    end; 
    FGetValleysCommand.ExecuteUpdate; 
    Result := TJSONValue(FGetValleysCommand.Parameters[0].Value.GetJSONValue(FInstanceOwner)); 
end; 

// This function errors at the highlighted line 
function TServerMethods1Client.UpdateUser(jsonobj: TJSONObject): Integer; 
begin 
    if FUpdateUserCommand = nil then 
    begin 
    FUpdateUserCommand := FDBXConnection.CreateCommand; <============= Error Here 
    FUpdateUserCommand.CommandType := TDBXCommandTypes.DSServerMethod; 
    FUpdateUserCommand.Text := 'TServerMethods1.UpdateUser'; 
    FUpdateUserCommand.Prepare; 
    end; 
    FUpdateUserCommand.Parameters[0].Value.SetJSONValue(jsonobj, FInstanceOwner); 
    FUpdateUserCommand.ExecuteUpdate; 
    Result := FUpdateUserCommand.Parameters[1].Value.GetInt32; 
end; 
.... 

서버가 실행되고 있지 않으면 첫 번째 기능이 오류가 발생합니다.

내가 곤혹 스럽다.

나는 또한 DataSnap을 처음 사용합니다.

+0

오류 메시지에 'FDBXConnection = nil'이 무엇을 제안합니다. –

+0

@FreeConsulting하지만 FDBXConnection은 프록시를 만드는 과정에서 생성됩니까 ?? 오, 내가 놓친 것을 본다. 연결은 작성시 매개 변수로 전달되어야합니다. 그들이 매개 변수없이 프록시 생성을 허용한다는 것이 이상하게 보입니까? 전 세계적으로 한 번 프록시를 만들거나 호출 할 때마다 로컬로 프록시를 만들어야합니까? 이 댓글을 답장하면 받아 들일 것입니다. – gwardell

답변

0

프로젝트 ChirpSR.exe는 '0x00e8d088에서 액세스 위반 : 주소를 0x00000000의 읽기'메시지 와 예외 클래스 $ C0000005을 올렸다.

FDBXConnection = nil의 오류 메시지가 표시됩니다. CreateCommand은 가상 메소드이므로 TDBXConnection(nil).CreateCommand을 호출하면 제시 한 예외가 발생합니다.