DataSnap返回数据集的方法的奇怪问题
一个服务器方法:
function TdssmServerMethods.GetDataR(const ASQLStr: string): TDBXReader;
var
aDBXCommand:TDBXCommand;
begin
if not sqlconMethods.Connected then
sqlconMethods.Open;
aDBXCommand:=sqlconMethods.DBXConnection.CreateCommand;
try
aDBXCommand.Text:=ASQLStr;
aDBXCommand.CommandType:=TDBXCommandTypes.DbxSQL; //'Dbx.SQL'
Result:=aDBXCommand.ExecuteQuery;
except
//
end;
end;
这个方法运行很奇怪啊,程序中如果第一次调用(连续执行几次不同ASQLStr的调用),能成功执行.
然后在后面(其它窗口),再执行这个方法时,就提示错误了,
客户端调用在FGetDataRCommand.ExecuteUpdate;这里出错,访问了无效指针.
win7系统, delphi xe6, 服务器配置为session
其它返回JSON类的方法不会出错.
xe2的DEMO有个类似方法:
function TdssmServerMethods.GetDataR(const ASQLStr: string): TDBXReader;
var
aDBXCommand:TDBXCommand;
aReader:TDBXReader;
aCDS:TClientDataSet;
begin
sqlconMethods.Open; //这是一个固定连接
aDBXCommand:=sqlconMethods.DBXConnection.CreateCommand;
try
aDBXCommand.Text:=ASQLStr;
aDBXCommand.CommandType:=TDBXCommandTypes.DbxSQL; //'Dbx.SQL'
aReader:=aDBXCommand.ExecuteQuery;
aCDS:=TDBXClientDataSetReader.ToClientDataSet(nil,aReader,True);
aCDS.Open;
Result:=TDBXClientDataSetReader.Create(aCDS,False);
finally
aDBXCommand.Free;
end;
end;
也一样出错类似的问题.
客户端调用方法:
function GetSelectItemParamList(SelectItemParamList:TSelectItemParamList):Boolean;
var
aName:string;
aSelParam:TSelectItemParam;
aSQL:string;
dr:TDBXReader;
begin
Result:=False;
aSQL:='SELECT * FROM TheSelectItems';
dr:=pClientServerMethods.GetDataR(aSQL);
try
if dr <> nil then
begin
while dr.Next do
begin
aName:=dr['SelectItemName'].AsString;
aSelParam.BankCode:=dr['BankCode'].AsString;
aSelParam.TableName:=dr['SelectItemTableName'].AsString;
aSelParam.CanEdit:=dr['CanEdit'].AsBoolean;
//SelectItemParamList.Add(aName,aSelParam);
if (aName <> '') and (aSelParam.TableName <> '') and (not SelectItemParamList.ContainsKey(aName)) then
begin
SelectItemParamList.Add(aName,aSelParam);
end;
end;
Result:=True;
end;
finally
dr.Free;
end;
end;
这里的dr按要求马上释放了
纠结啊