这个现象是不是Delphi XE7 DataSnap 的BUG
如下程序片段:
//服务器端:取得数据封包
function TPATDMServerMethods.GetDBData(Value: string): OleVariant;
var
adsQuery: TADODataSet;
dspProvider: TDataSetProvider;
begin
dspProvider := TDataSetProvider.Create(self);
adsQuery := TADODataSet.Create(self);
try
adsQuery.Connection := connDB01TFMS;
adsQuery.CommandText := Value;
dspProvider.DataSet := adsQuery;
adsQuery.Open;
Result := dspProvider.Data;
finally
adsQuery.Close;
FreeAndNil(adsQuery);
FreeAndNil(dspProvider);
end;
end;
//改变SQL以得不同表的数据
function TPATDMServerMethods.ChangeQuerySQL(Value: string): integer;
begin
Result := 0;
with adsDBQuery do
begin
Close;
if Value<>'' then
CommandText := Value;
Open;
Result := RecordCount;
end;
end;
//客户端 ,用服务器端第一个方法取得数据。
function GetData(const AcmdText: string; var ADataSet: TClientDataSet):boolean;
var
AData: OleVariant;
AProxy: TPATDMServerMethodsClient;
begin
Result := False;
if not PATDMDM.connPATDM.Connected then
PATDMDM.connPATDM.Connected := True;
AProxy :=TPATDMServerMethodsClient.Create(PATDMDM.connPATDM.DBXConnection);
try
try
AData := AProxy.GetDBData(AcmdText);
if not (VarIsNull(AData) or VarIsEmpty(AData)) then
begin
ADataSet.Close;
ADataSet.Data := AData;
ADataSet.Open;
Result := True;
end
else
begin
Result := False;
raise Exception.Create('获取数据失败,请重试!');
end;
except
on E: Exception do
begin
Result := False;
raise Exception.Create('连接远程服务器获取数据出错,错误:' + E.Message);
end;
end;
finally
FreeAndNil(AProxy);
end;
end;
//调用上面客户端函数
GetData('select * from dbo.TF_Users order by UserID',cdsUsers)
问题:当用户数据表TF_Users有一个类型为varbinary(256)字段(用于存放加密后的密码,数据库MS SQL 2005)时,当服务端程序第一次启动,客户端第一次连接后,调用上面的函数获取数据时都会出错,错误内容是:存取到无效地址在xxxxx,然后程序就死了,服务端服务也很难停止。
为了这个问题真是伤透脑筋。后经反复测试发现,只要表中不包含这个varbinary(256)类型字段,就不会出现上述错误。但我不明白为什么会这样?是不是Delphi XE7 的BUG?请高手说说。谢了!