DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: pixelcraft
今日帖子: 56
在线用户: 13
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 ls_xiaolong1 (雪岩) ★☆☆☆☆ -
普通会员
2017/11/23 10:59:34
标题:
SQL语句,执行后,能检验是否执行成功? 浏览:1997
加入我的收藏
楼主: SQL语句,执行后,能检验是否执行成功?
----------------------------------------------
-
作者:
男 supermay (supermay) ★☆☆☆☆ -
盒子活跃会员
2017/11/23 11:04:36
1楼:
----------------------------------------------
链接:https://pan.baidu.com/s/12jzmECYKhGCsHBxz8tmB6w 提取码:pelr --来自百度网盘超级会员V9的分享
作者:
男 ls_xiaolong1 (雪岩) ★☆☆☆☆ -
普通会员
2017/11/23 11:10:31
2楼: 请教了,那要怎么样检验呀。大侠
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/23 12:01:07
3楼: 我记得,只要没发生错误,就是成功了啊。
当然,如果你语句写的就是那种没效果的,那就另说了。
错误一般是 语法错误 或 违反约束。
如果你语法没错 也没有违反约束,但是代码的意思,就是不修改数据,那么自然是数据库不变了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2017/11/23 13:32:21
4楼: 请百度 delphi异常处理.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 lsh341999 (虫子) ★☆☆☆☆ -
普通会员
2017/11/23 14:06:05
5楼: 创建对象,如TStringList;数据库组件啊等
Try
  挂起事务
  Try
    执行SQL
    执行事务
    刷新页面
  Except
    回滚事务
    抛出异常
  End;
Finally
  释放对象
End;
----------------------------------------------
就怕想不到,没有做不到的
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/23 14:25:31
6楼: 我居然是在 finally 里头回滚。

建立对象
try
  开启事务
  try
    运行程序
    if 存在事务 then
      提交;
  fianlly
    if 存在事务 then
      回滚;    
  end;
fianlly
  释放对象
end;

异常我就不处理了,交给统一的处理模块。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 ls_xiaolong1 (雪岩) ★☆☆☆☆ -
普通会员
2017/11/23 18:16:03
7楼: 我是正常在SQL 里用的UPDATE 然后每次运行后都一个检验。


但在下次的操作中我发现还是有修改不成功的情况存在,但不多,也没有抛出异常。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/23 18:30:25
8楼: 假设 开启了事务。
执行了 update
没提交事务 或事务被 回滚了。 这样肯定就没效果了。

其他情况,只能说 你这个 update 是不是别的控件帮你代理执行的。
不是 ADO FIREDAC 这种直接控件执行的?
别的控件也许他自己有 BUG ,没给你执行成功。
例如 DATASNAP 的 三层模式。你 cds 提交了,也许 服务器没成功。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 ls_xiaolong1 (雪岩) ★☆☆☆☆ -
普通会员
2017/11/23 18:48:08
9楼: //=====
if sGetState = '0' then
begin
  //=====
  sql_UpdateLibraryNum := 'update Library_Info set Library_Number='''+sNowLibrNumber+''' where Bar_Code='''+sBarCode+''' and Name='''+sLeechdomName+''' and PY_Code='''+
      sPYCode+''' and Code='''+sCode+''' and Specifications='''+sSpec+''' and JiType='''+sJiType+''' and Measuring_Unit='''+sUnit+''' and Buy_Price='''+sBuyPrice+
      ''' and Sell_Price='''+sSellPrice+''' and Valid_Until='''+sValidUntil+''' and Batch_Number='''+sBacthNumber+''' and Library_Name='''+sOutputLibrary+'''';
  try
    //=====    修改库存数量
    qry_Write.sql.Clear;
    qry_Write.SQL.Add(sql_UpdateLibraryNum);
    qry_Write.ExecSQL;

    //  系统延时50毫秒
    delayTime(50);

    //  检查数据是否写入数据库_调剂室
    if not checkDataIsWriteDatabase_Library(sLeechdomName,sPYCode,sBarCode,sCode,sSpec,sJiType,sUnit,sSellPrice,sBuyPrice,sValidUntil,sBacthNumber,sOutputLibrary,sNowLibrNumber) then
    begin
      qry_Write.ExecSQL;

      print_Msg_Log2(FormatDateTime('yyyyMMdd',date)+'GetLeechdom_Succ_Log',
          '检查写入数据-失败,再次对数据进行了修改写入操作。'+#13#10+qry_Write.SQL.Text);
    end;

    {完成信息写入日志}
    print_Msg_Log2(FormatDateTime('yyyyMMdd',date)+'GetLeechdom_Succ_Log',
        '库存数量为:'+sLibraryNum+#13#10+qry_Write.SQL.Text);
  except
    on E:Exception do
    begin
      //=====
      //SetDlgAutoClose(5000);
      MessageBox(self.handle,PChar('修改库存数据失败!!'+e.Message),'错误提示',MB_OK or MB_ICONERROR);
      {完成信息写入日志}
      print_Msg_Log2(FormatDateTime('yyyyMMdd',date)+'GetLeechdom_Error_Log','修改库存数据失败!!'+e.Message);
      Exit;
    end;
  end;
end;
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/23 18:52:48
10楼: 如果不是事务被撤销或回滚
只能说 qry_Write 他是不是有 BUG 呢?

当然 还存在一种可能。

用户 A 执行了 代码 update 成了 一种
用户 B 执行了 代码 update 成了 另一种
这个时候 用户 A 才执行到了检查的代码。结果自然是检查失败。
即便你 A 又写了一遍。
用户 B 的检查代码发现检查失败。
B 又写了一遍。
自然对 A 来说,还是写 失败了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 ls_xiaolong1 (雪岩) ★☆☆☆☆ -
普通会员
2017/11/23 19:12:10
11楼: 谢谢,我现在用事务再写一下。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/23 21:16:34
12楼: 你不懂 汉语 如果 的意思吗?
你居然故意要加事务?

你还是考虑一下 用户 A 和 B 的问题吧。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 ls_xiaolong1 (雪岩) ★☆☆☆☆ -
普通会员
2017/11/23 21:50:22
13楼: 好的,谢谢先!!!

现在先不去想 A 与 B 的问题。


如果真的是 qry_Write 有BUG的话。

能否使用存储过程?是否比直写好一些。
----------------------------------------------
-
作者:
男 lsh341999 (虫子) ★☆☆☆☆ -
普通会员
2017/11/24 8:13:08
14楼: 俺发现ADO有一个不是BUG的BUG

比如
--第一条
UPDATE 表 SET
字段1=字段1+1
WHERE 条件
--第二条
UPDATE 表 SET  1111
字段1=字段1+1
WHERE 条件

从上面语句来看,很明显第二条是错误
这两条一起执行的话,
第一条更新到了,第二条没有更新到,
如果ADO还是默认设置的话,是不会抛异常的,这样操作是很危险的
在执行SQL时ADO应该要
  FDataQuery.ExecuteOptions:=[TExecuteOption.eoExecuteNoRecords];
  Try
    Try
      执行SQL
    except
      on e:exception do
      Begin
        招聘异常
      End;
    End;
  Finally
    FDataQuery.ExecuteOptions:=[];
  End;

用以上代码可以做到,只要有一条SQL语句执行错误就会抛出异常
----------------------------------------------
就怕想不到,没有做不到的
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行62.5毫秒 RSS