为什么我用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 的基本语法错误提示,如何解决?谢谢
...全文
419 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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 我测试过了,好像没什么问题
在Windows 10或Windows 11操作系统中,用户经常会遇到共享打印机时出现的一系列错误代码,这些错误代码可能会阻碍打印机共享功能的正常使用。常见的错误代码包括0x00000057、0x00000709和0x0000011b,这些代码通常指出了不同的问题,比如权限不足、服务未运行或配置错误等。除此之外,还有一些故障提示如“连接失败”或“内存不足”,这些都可能影响到打印机共享的稳定性。 要解决这些故障,首先要确保打印机已经正确地连接到网络,并且在需要共享的电脑上进行了设置。确保打印机驱动程序是最新的,并且在共享设置中没有错误配置。对于权限问题,需要检查网络上的用户账户是否具有足够的权限来访问共享打印机。同时,也要确保打印机服务正在运行,特别是“Print Spooler”服务,因为这是打印机共享服务的核心组件。 在某些情况下,问题可能与操作系统的更新有关,如升级到最新版的Windows 10或Windows 11后可能出现的兼容性问题。这时,可能需要查看微软的官方支持文档来获取特定的解决方案或更新。 对于错误代码0x00000057,这通常是由于没有足够的权限来访问网络打印机或其共享资源,解决方法是确保网络打印机的权限设置正确,包括在组策略中设置相应的访问权限。而0x00000709错误可能是由于打印机驱动问题或打印机端口配置错误,可以尝试重新安装或更新打印机驱动来解决。至于0x0000011b错误,这往往是因为打印机队列服务的问题,检查并重启“Print Spooler”服务通常是解决这类问题的常见手段。 至于“连接失败”或“内存不足”这类故障,通常与客户端和打印机之间的网络连接以及打印机本地资源的使用情况有关。检查网络连接,确保打印机所在的网络段没有故障或中断。同时,如果打印机的打印队列长时间得不到处理,可能会导致内存不足的情况,这时可能需要清理打印队列或增加打印机的内存配置。 为了帮助用户更快速地解决这些问题,市面上出现了各种打印机共享错误修复工具。这些工具往往通过预设的修复程序来自动检测和修正打印机共享中常见的问题。它们可以快速检查打印机驱动、网络连接以及共享设置,并且能够提供一键修复功能,大幅减少了用户自行排查和解决问题的难度。 然而,在使用这些修复工具之前,用户应确保这些工具的来源是安全可靠的,避免因使用不当的修复工具而引发其他系统安全或隐私问题。用户可以到官方平台或者信誉良好的软件提供商处下载这些工具。通过细心检查打印机的共享设置,及时更新驱动程序和服务,以及合理使用修复工具,大多数共享打印机的问题都可以得到有效的解决。

5,928

社区成员

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

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