为什么我用update不更新指定的字段及如何动态组成sql语句

hzzkf 2000-07-18 03:27:00
高手们,在下有两个问题请教大家:
1、我的程序中有这样一段语句
...
dataunit.DataModule1.query1.SQL.Add('update 员工管理 set 员工代码=:员工 代码,员工姓名=:员工姓名,员工级别=:员工级别,员工密码=:员工密码 where 员工代码=:员工代码');
if not (dataunit.DataModule1.query1.Prepared)
then dataunit.DataModule1.query1.Prepare;
dataunit.DataModule1.Query1.Params[0].asstring:=edit5.text;
dataunit.DataModule1.Query1.Params[1].asstring:=edit6.text;
dataunit.DataModule1.Query1.Params[2].asstring:=edit7.text;
dataunit.DataModule1.Query1.Params[3].asstring:=edit8.text;
dataunit.DataModule1.Query1.Params[4].asstring:=aa;(为一个设定的字段变量,借此在记录中定位)
dataunit.DataModule1.query1.unprepare;
dataunit.DataModule1.query1.ExecSQL;
...
可以用此语句更新表中某个定位记录的除'员工代码'(此字段为索引字段)外的字段,但却不能将'员工代码'字段的内容修改,除非将where条件语句删除,应如何解决?
2.我想在程序中动态组成sql语句,比如我想根据combobox1.text的内容组成一个语句'select * from 员工管理 where '+combobox1.text+' =:员工代码 order by 员工代码 asc ',我可以先将它存在一个字符串变量中用于sql.add的语句中,编译后可以运行通过,但在每次使用时总是要出现一个sql 的基本语法错误提示,如何解决?谢谢
...全文
395 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
meijg 2000-07-18
  • 打赏
  • 举报
回复
你的combobox1.text里是什么内容,是字段的名字吗
hzzkf 2000-07-18
  • 打赏
  • 举报
回复
meijg:
我试过showmessage了,发现了一个问题:如果用sql.add('select * from table1 where '+combobox1.text+'=:参数');的语句,combobox1.text的内容不能替代入程序,如果用一个字段名称直接代替combobox1.text的内容(比如'员工代码')程序会识别此变量,如何解决?
meijg 2000-07-18
  • 打赏
  • 举报
回复
可以的话,把你的源代码发过来看看
meijg@elong.com
meijg 2000-07-18
  • 打赏
  • 举报
回复
我这里一切正常,你用了showmessage吗,看看sql语句到底是什么
hzzkf 2000-07-18
  • 打赏
  • 举报
回复
meijg:
你回答我的第二个问题的结果和我一样,在第一次运行时总会报'incorrect syntax near '='。
meijg 2000-07-18
  • 打赏
  • 举报
回复
1。 这里不是主键的问题,你要将你想修改的字段与原有的字段值分开
比如 员工代码=:员工代码,.....where 员工代码=:原来的代码
这里要把员工代码(改过的)和原来的代码严格区分开来
查询参数的时候最好用parambyname('员工代码‘),区分的好一点
2。你的语句不享有问题,仔细查查参数是否出错
我写了一个 sql.add('select * from table1 where '+combobox1.text+'=:参数');
注意你的where 后面有没有空格
hzzkf 2000-07-18
  • 打赏
  • 举报
回复
halfdream:
我已将'员工代码'设为主键
hzzkf 2000-07-18
  • 打赏
  • 举报
回复
各位,第二个问题的意思是说我想根据一个combobox1.text的内容动态组成一个不提示语法错误的sql语句,比如说select * form zzz where zz='ttt',其中的zz便根据combobox1.text的内容随时改变,怎样编写??
halfdream 2000-07-18
  • 打赏
  • 举报
回复
1.这是数据库表设计的问题,你应该在表中增加一个字段作为主键来标识,
而不要它将一般情况下的员工代码概念混起来。

hzzkf 2000-07-18
  • 打赏
  • 举报
回复
ary:
在程序中我已给aa变量赋于原员工代码的值,不然的话,其他的字段就都不会改变了。
meijg 2000-07-18
  • 打赏
  • 举报
回复
好像是这样的
showmessage(dataunit.datamodule1.query1.sql[0])
sql是tsrings类型的
码狂 2000-07-18
  • 打赏
  • 举报
回复
1、你的SQL语句有问题,要改为
dataunit.DataModule1.query1.SQL.Add('update 员工管理 set 员工代码=:员工代码,员工姓名=:员工姓名,员工级别=:员工级别,员工密码=:员工密码 where 员工代码=:原员工代码');
这么简单的原因不用我说吧。
2、错
改为
dataunit.DataModule1.query1.prepare;
ShowMessage(dataunit.DataModule1.query1.SQL); //调试用,看看你的SQL
dataunit.DataModule1.query1.ExecSQL;


meijg 2000-07-18
  • 打赏
  • 举报
回复
你又要改员工代码,又把它作为条件,怎么行呢
2 我测试过了,好像没什么问题

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧