DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: lorangeve
今日帖子: 41
在线用户: 14
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2018/4/1 11:03:00
标题:
刚学三层,遇到问题,求大神们指教! 浏览:2219
加入我的收藏
楼主: 服务端代码
function TServerMethods1.ChangeSql(Value: string): Integer;
begin
  fdqry1.Active:=False;
  fdqry1.SQL.Text:=Value;
  fdqry1.Active:=True;
  Result:=fdqry1.RecordCount;
end;

procedure TServerMethods1.DSServerModuleCreate(Sender: TObject);
begin
  con1.Open;
end;

function TServerMethods1.EchoString(Value: string): string;
begin
  Result := Value;
end;

function TServerMethods1.ReverseString(Value: string): string;
begin
  Result := System.StrUtils.ReverseString(Value);
end;

在客户端调用changesql时,sql字符串如果是查询就没问题,但如果插入一行数据就会出现
异常类名称:TDBXError
异常信息:Remote error: [FireDAC][Phys][MSSQL]-308. Cannot open / define command, which does not return result sets. Hint: use Execute / ExecSQL method for non-SELECT commands
客户端调用代码:
procedure TForm1.btn2Click(Sender: TObject);
var
  dm:TServerMethods1Client; //就是上一步自动生成的unit3里的那个映射类
  SqlText,人员编号,就诊日期,诊断结果,处方,费用,是否结清:string;
begin          // 别忘了uses Unit3, Unit2;
  try
    try
      //创建应用服务器上的方法在客户端的实现类: 即映射方法类
      dm:=TServerMethods1Client.Create(DataModule2.con1.DBXConnection);
      //执行服务器上的方法
      人员编号:='00000008';
      就诊日期:='2018-09-17';
      诊断结果:='咳嗽';
      处方:='中药';
      费用:='240.00';
      是否结清:='未结清';
      SqlText:='INSERT INTO 治疗情况表 (人员编号,就诊日期,诊断结果,处方,费用,是否结清) VALUES (' + QuotedStr(人员编号) + ',' + QuotedStr(就诊日期) + ',' + QuotedStr(诊断结果) + ',' + QuotedStr(处方) + ',' + QuotedStr(费用) + ',' + QuotedStr(是否结清) + ')';
      dm.ChangeSql(SqlText); // 我们在服务器程序中手工添加的执行sql方法
    except
      on E: Exception do mmo1.Lines.Add('异常类名称:' + E.ClassName + #13#10 + '异常信息:' + E.Message);
    end;
  finally
    dm.Free;
  end;
  DataModule2.ds1.Close;
  DataModule2.ds1.Open; //开启客户端数据集
end;
这个执行完之后,数据库里的数据是增加了,但是却出现这个错误,请大神指教,谢谢~~如果需要源码,请联系QQ1817203915,在线等~
----------------------------------------------
作者:
男 idealstudio (ideal) ★☆☆☆☆ -
盒子活跃会员
2018/4/1 12:04:43
1楼: 异常信息:Remote error: [FireDAC][Phys][MSSQL]-308. Cannot open / define command, which does not return result sets. Hint: use Execute / ExecSQL method for non-SELECT commands
异常信息已经说的很明白了,insert不能用Active,用Execute/ExecSQL方法。

你要么分开SELECT与INSERT/DELETE/UPDATE为两个方法,要么在执行时判断是SELECT还是INSERT/UPDATE/DELETE.
----------------------------------------------
-
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2018/4/1 12:38:39
2楼: 之前我也用了execute和execsql试过,但可能是因为不会用。。。。
function TServerMethods1.GetData(Value: string): Integer;
begin
  fdqry1.Active:=False;
  fdqry1.SQL.Text:=Value;
  fdqry1.Active:=True;
  Result:=fdqry1.RecordCount;
end;

function TServerMethods1.ChangeData(Value: string): Integer;
begin
  fdqry1.SQL.Text:=Value;
  fdqry1.ExecSQL;
  Result:=fdqry1.RecordCount;
end;
我在服务端修改了以上代码,但是依然是那个错误,调用:
procedure TForm1.btn2Click(Sender: TObject);
var
  dm:TServerMethods1Client; //就是上一步自动生成的unit3里的那个映射类
  SqlText,人员编号,就诊日期,诊断结果,处方,费用,是否结清:string;
begin          // 别忘了uses Unit3, Unit2;
  try
    try
      //创建应用服务器上的方法在客户端的实现类: 即映射方法类
      dm:=TServerMethods1Client.Create(DataModule2.con1.DBXConnection);
      //执行服务器上的方法
      //ShowMessage(dm.ReverseString(edtIP.Text)); //系统带的例子方法
      人员编号:='00000008';
      就诊日期:='2018-09-17';
      诊断结果:='咳嗽';
      处方:='中药';
      费用:='240.00';
      是否结清:='未结清';
      SqlText:='INSERT INTO 治疗情况表 (人员编号,就诊日期,诊断结果,处方,费用,是否结清) VALUES (' + QuotedStr(人员编号) + ',' + QuotedStr(就诊日期) + ',' + QuotedStr(诊断结果) + ',' + QuotedStr(处方) + ',' + QuotedStr(费用) + ',' + QuotedStr(是否结清) + ')';
      dm.ChangeData(SqlText); // 我们在服务器程序中手工添加的执行sql方法
    except
      on E: Exception do mmo1.Lines.Add('异常类名称:' + E.ClassName + #13#10 + '异常信息:' + E.Message);
    end;
  finally
    dm.Free;
  end;
  DataModule2.ds1.Close;
  DataModule2.ds1.Open; //开启客户端数据集
end;
----------------------------------------------
作者:
男 idealstudio (ideal) ★☆☆☆☆ -
盒子活跃会员
2018/4/1 12:59:04
3楼: function TServerMethods1.ChangeData(Value: string): Integer;
begin
  if fdqry1.Active then fdqry1.Close;
  fdqry1.SQL.Text:=Value;
  fdqry1.ExecSQL;
end;

INSERT不可能取到RecordCount的。非要取到RecordCount的,只有重新打开。
----------------------------------------------
-
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2018/4/1 13:09:10
4楼: 无语了,还是那个错误,能不能请楼上帮我看看?我QQ1817203915,拜托了,卡住2天了
----------------------------------------------
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2018/4/1 13:16:01
5楼: 找到原因了,谢谢idealstudio (ideal)解决了问题~~
----------------------------------------------
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/4/1 17:55:20
6楼: 找到原因了,保密局的。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2018/4/1 19:20:20
7楼: wang_80919批评得对。只向别人索取,吝啬施与和回报人的可悲。
----------------------------------------------
-
作者:
男 cenunus (cenunus) ★☆☆☆☆ -
普通会员
2018/4/13 9:46:15
8楼: 晕了,我在5楼指出是idealstudio (ideal)解决了问题,你们不能看看3楼的代码吗?
----------------------------------------------
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行74.21875毫秒 RSS