起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 257|回复: 10

[结贴]Query insert 报错

[复制链接]
发表于 2009-8-28 11:11:58 | 显示全部楼层 |阅读模式
---------------------------
X3 Studio
---------------------------
运行系统初始化的时候发生异常:ExecuteSQL error: Invalid SQL statement or JDBC escape, terminating ''' not found.

类型:Exception。
---------------------------
确定   
---------------------------


SQL server 2000数据库,执行到lQuery.execute时报错。
跟进去找到Query的CommandText的内容,在查询分析器中可以正常执行
回复

使用道具 举报

发表于 2009-8-28 11:19:30 | 显示全部楼层
贴出来语句看看
回复 支持 反对

使用道具 举报

发表于 2009-8-28 11:21:05 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-28 11:22:04 | 显示全部楼层
Insert into TTEXTMAIL(FRECEIVERID,FTITLE,FCONTENT,FFLAG, FMAILTYPE) values ('wangchao','员工合同到期提醒','<style>
.digesttable {BORDER-RIGHT: #335687 1px solid;BORDER-TOP: #335687 1px solid;FONT-SIZE: 12px;BORDER-LEFT: #335687 1px solid;COLOR: #000000;BORDER-BOTTOM: #335687 1px solid;FONT-FAMILY: Arial, Helvetica, sans-serif;BACKGROUND-COLOR: #ffffff}
.tableheader {FONT-WEIGHT: bold;FONT-SIZE: 12px; COLOR: #000000;FONT-FAMILY: Arial, Helvetica, sans-serif;BACKGROUND-COLOR: #dedede}
</style><font style="font-family:黑体"><b>两个月内到期合同</b></font><br><br><table class="digesttable" cellspacing="0" cellpadding="3" width="100%" border="1"><tr class="tableheader" ><td >姓名</td><td >工号</td><td >部门</td><td >合同开始时间</td><td >合同结束时间</td></tr><tr class="digesttable" ><td >xxxx</td><td >0129</td><td >智能卡应用技术部</td><td >2007-08-12</td><td >2009-08-31</td></tr><tr class="digesttable" ><td >xxxx</td><td >0130</td><td >智能卡应用技术部</td><td >2007-08-14</td><td >2009-08-31</td></tr><tr class="digesttable" ><td >xxxx</td><td >0131</td><td >智能卡应用技术部</td><td >2007-08-15</td><td >2009-08-31</td></tr><tr class="digesttable" ><td >xxx</td><td >0132</td><td >智能卡应用技术部</td><td >2007-09-13</td><td >2009-09-30</td></tr><tr class="digesttable" ><td >xxx        </td><td >0214</td><td >无线通信部</td><td >2006-08-13</td><td >2009-08-31</td></tr><tr class="digesttable" ><td >xxxx</td><td >0276</td><td >生产与质量部</td><td >2007-08-22</td><td >2009-08-31</td></tr><tr class="digesttable" ><td >xxxx</td><td >0280</td><td >资源管理部</td><td >2007-09-19</td><td >2009-09-30</td></tr><tr class="digesttable" ><td >xxxx</td><td >0351</td><td >总经理办公室</td><td >2006-09-01</td><td >2009-08-31</td></tr><tr class="digesttable" ><td >xxxx</td><td >0353</td><td >人力资源部</td><td >2006-09-07</td><td >2009-09-30</td></tr><tr class="digesttable" ><td >xxx</td><td >0354</td><td >智能卡平台技术部</td><td >2006-09-13</td><td >2009-09-30</td></tr><tr class="digesttable" ><td >xxxx</td><td >0355</td><td >IP模块技术部</td><td >2006-09-18</td><td >2009-09-30</td></tr><tr class="digesttable" ><td >xxx</td><td >0437</td><td >华大电子</td><td >2007-08-13</td><td >2009-08-31</td></tr><tr class="digesttable" ><td >xxxx</td><td >0438</td><td >智能卡应用技术部</td><td >2007-08-20</td><td >2009-08-31</td></tr><tr class="digesttable" ><td >xxxx</td><td >0439</td><td >总经理办公室</td><td >2007-09-03</td><td >2009-09-30</td></tr></table>',0,'HTML')
回复 支持 反对

使用道具 举报

发表于 2009-8-28 11:34:40 | 显示全部楼层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-28 11:35:02 | 显示全部楼层
试了下不行,还有别的字符可能影响么
你可以看到,内容里面根本就没有单引号
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-28 11:43:28 | 显示全部楼层
5楼的跟我这问题有什么相关的么?
回复 支持 反对

使用道具 举报

发表于 2009-8-28 13:37:55 | 显示全部楼层
3楼和5楼的问题结合起来,就是你的sql解析不了。用5楼的办法去处理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-8-28 13:47:45 | 显示全部楼层
我没明白。整个代码是这么写的,请说说如果传的比较复杂该怎么处理
var
  lQuery: TQuery;
const
   insSQL = 'Insert into TTEXTMAIL(FRECEIVERID,FTITLE,FCONTENT,FFLAG, FMAILTYPE) values (''%s'',''%s'',''%s'',0,''HTML'')';
begin
    lQuery:= TQuery.Create(nil);
    try
      lQuery.ConnectionString:= 'DATABASEURL=Biz:\SYSTEM\SYSTEM.DATABASE';
      lQuery.CommandText:= SysUtils.Format(insSQL,[ReceiverID, Title, Content]);
      lQuery.Execute;
    finally
      lQuery.Free;
    end;
end;
回复 支持 反对

使用道具 举报

发表于 2009-8-28 13:51:51 | 显示全部楼层
通过SQL语句,通常是用TQuery来处理
lQuery.CommandText := 'insert into table1 (zd1, zd2) values ('''+str1+''',''''+str2+''')';

这样的话,如果Str1或者Str2中存在单引号,就会有问题,因为这个SQL语句已经乱掉了
可以用数据集的参数来解决:
lQuery.CommandText := 'insert into table1 (zd1, zd2) values (:str1, :str2)';
lQuery.Params.ParamByName('str1').Value := str1;
lQuery.Params.ParamByName('str2').Value := str2;

这样把字符串的值和SQL语句分开传递给数据库服务器,就不会出现你说的问题了。

(时间关系,以上代码没有测试,这样的做法我已经做过多次,应该没有问题)
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-17 03:17 , Processed in 0.041933 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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