起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 170|回复: 6

DataSet执行ExecuteSQL出错或TQeury执行Execute出错!!急!**

[复制链接]
发表于 2009-2-19 09:52:26 | 显示全部楼层 |阅读模式
跟踪出来的Sql语句是:
UPDATE T_AJ_YS
   SET AJMC        = '''"~!@#$%^&*()_+23453fssfsdf第三方第二次功能测试汇总''"~!@#$%^&*()_+',
       ZYAQ        = 'Sdjfw"eiFUKC',
       XCKCHDCFWQK = 'Sdjfwei:'
WHERE AJ_ID = '0209020000908231'

程序的写法是
1:报list index out of bound(-1)的错
DataSet.Connection.ExecuteSQL(
    'UPDATE T_AJ_YS ' +
    '   SET AJMC = ' + SysUtils.QuotedStr(DataSet.FieldByName('AJMC').AsString) + ', ' +
    '       ZYAQ = ' + SysUtils.QuotedStr(DataSet.FieldByName('ZYAQ').AsString) + ', ' +
    '       XCKCHDCFWQK = ' + SysUtils.QuotedStr(DataSet.FieldByName('XCKCHDCFWQK').AsString) +
    ' WHERE AJ_ID = ' + SysUtils.QuotedStr(DataSet.FieldByName('AJID').AsString));


2、报无效的列索引
with TQuery.Create(nil) do
  try
    Connection := DataSet.Connection;
    CommandText :=
      'UPDATE T_AJ_YS ' +
      '   SET AJMC = ' + SysUtils.QuotedStr(DataSet.FieldByName('AJMC').AsString) + ', ' +
      '       ZYAQ = ' + SysUtils.QuotedStr(DataSet.FieldByName('ZYAQ').AsString) + ', ' +
      '       XCKCHDCFWQK = ' + SysUtils.QuotedStr(DataSet.FieldByName('XCKCHDCFWQK').AsString) +
      ' WHERE AJ_ID = ' + SysUtils.QuotedStr(DataSet.FieldByName('AJID').AsString);
    Execute;

  finally
    Free;
  end;
回复

使用道具 举报

 楼主| 发表于 2009-2-19 09:54:57 | 显示全部楼层
初步判断原因是因为在SQL语句里同时包含有": 时就会有问题!

解析SQL语句时碰到" 里的: 时认为: 后的是变量的问题!

请问要啥解决???
回复 支持 反对

使用道具 举报

发表于 2009-2-19 10:02:12 | 显示全部楼层
还是换一种符号吧,如:全角的:

另外,你把系统真正执行的sql语句打印出来看看,是否缺少了引号
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-19 10:09:39 | 显示全部楼层
没办法换,如果有办法换早换了,
sql跟踪出来的就是
UPDATE T_AJ_YS
   SET AJMC        = '''"~!@#$%^&*()_+23453fssfsdf第三方第二次功能测试汇总''"~!@#$%^&*()_+',
       ZYAQ        = 'Sdjfw"eiFUKC',
       XCKCHDCFWQK = 'Sdjfwei:'
WHERE AJ_ID = '0209020000908231'


平台没办法解决吗?这个在delphi中的adoquery也是同样存在。

网上搜索到的:
用DELPHI的程序员都知道ADO的易用性,用ADO控件操作数据库是非常受欢迎的,但使用ADO也会碰到一些麻烦问题,就像DELPHI 5下如果要用ADO就要先装好ADO补丁,有的SQL的语句在数据库工具里执行可以成功但用DELPHI的AdoQuery执行不一定能成功。今天又碰到这问题:ADO要执行的SQL语句里同时包含有": 时就会有问题,如下面SQL语句:

AdoQuery1.Close;
AdoQuery1.Sql.text:='Insert T_SavePartTab(FID, FPart) Values(''0001'',''"c:\part1";"d:\part2"'')';
AdoQuery1.ExecSql;
执行这语句后可能就会提示:不正常地定义参数对象。提供了不一致或不完整的信息。

这是由于ADO控件在解析SQL语句时碰到" 里的: 时认为: 后的是变量,是在参数Parameters[]里进行赋值的变量,而实际上: 我们只是当字符用,这时报出要定义参数显然不是我们想要的。

这个问题的解决方法:

  1、通过替换: 或" 字符为其它字符(如" 替成' );

  2、不让ADO控件检测SQL语句参数变量,AdoQuery1.ParamCheck := false;

这两种情况只能结合实际情况使用,都有弊端这里就不哆嗦了,欢迎大家讨论!
回复 支持 反对

使用道具 举报

发表于 2009-2-19 10:54:04 | 显示全部楼层
你试试把易出非正常字符的地方换成参数,然后再对参数赋值。
或者用数据控件append方式插入数据。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-2-19 14:48:01 | 显示全部楼层
晕。。。。。。系统里大量应用这些写法!
你们平台是否存在这样子的缺陷?
回复 支持 反对

使用道具 举报

发表于 2009-2-19 14:57:05 | 显示全部楼层
这个怎么能算缺陷呢?
就算用java,直接用sql去添加数据同样会出这样的问题。
我还记得php,asp有一个叫  '    的sql漏洞。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-27 18:14 , Processed in 0.039279 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表