我有两个相同的表(列计数、名称和设置)。我有一个相同的行在每个表上,相同的信息。其中一列是 BLOB
键入列并包含图像(bmp)。
两个行/表都有一个 id
列, auto increment
,因此两个表中的每一行的id都是相同的。列设置为 blob
类型可以是 NULL
(已设置)。
我用的是 action
具有以下查询的:
dbmodule.arhivaQuery.SQL.Clear;
dbmodule.arhivaQuery.SQL.Add('UPDATE `database_name`.`2nd_table_name` SET `column_name`=deleted WHERE `id`=''' + inttostr(dbmodule.comenziDataSetid.Value) + ''';');
dbmodule.arhivaQuery.ExecSql(true);
理论上,这应该通过从blob列中删除bmp来更新第二个表中的行,或者更确切地说,用单词“deleted”替换bmp。如果没有,图像仍在列/行中。
有几件事需要澄清:
dbmodule是包含数据集、数据源、sql连接和查询的数据模块的名称( TSimpleDataSet
, TDataSource
, TSQLConnection
, TSQLQuery
).
arhivaquery是我正在使用的查询的名称(a) TSQLQuery
)column_name=列的名称,我已经在这个粘贴中编辑了,这样您可以得到更清晰的图片。
您注意到,在最后,我使用第一个表中的行的id来更改第二个表中的数据,这就是为什么会出现这种情况(两个表中的行的id是相同的)。
当我执行这个命令时,它应该在两个表中都保留这两行,但是只更新第二个表中的行,方法是从blob列中删除它的映像。所以在这之后我应该 row
在第一个 table
图像在blob列中,第二个表中的同一行在blob列中没有图像。
我猜我的sql语法是错误的(有一些警告也这么说),有人能帮我改正吗?
1条答案
按热度按时间dfuffjeb1#
如果要清除blob字段的内容,请将其赋值为null。
如果要为那些没有值的列显示“已删除”,请在
SELECT
语句检索内容时使用IFNULL()
或者COALESCE()
,以dbms支持的为准。您可以做的另一个改进(既可以简化编码,又可以防止sql注入)是停止连接sql,转而使用参数。这也意味着你可以停止所有的
'''
双引号、三引号、四引号和数据类型转换,因为db驱动程序将为您处理所有这些。注意:一些db驱动程序需要
Params.ParamByName
相反。如果一个不行,另一个会。最后,将您的sql长行分解为可管理的部分,这样您就可以停止所有的滚动来阅读它。