使用 sql 语法为具有 Null 或任何其他值的特定行更新单个 BLOB 列
Update a single BLOB column for a specific row with a Null or any other value using a sql syntax
我有 2 个相同的 table(列数、名称和设置)。
我在每个 table 上有 1 个相同的行,相同的信息。
其中一列是 BLOB
类型的列并包含图像 (bmp)。
两行/tables 都有一个 id
列,auto increment
,所以 id 在两个 tables 中的每一行都是相同的。
设置为 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 来更新第二个 table 中的行,或者更确切地说,用单词 "deleted" 替换 bmp。不是,图像还在列/行中。
有几点需要澄清:
dbmodule 是包含数据集、数据源、sql 连接和查询的数据模块的名称。 (TSimpleDataSet
, TDataSource
, TSQLConnection
, TSQLQuery
).
arhivaQuery 是我正在使用的查询的名称 (a TSQLQuery
)
column_name = 列的名称,我已在此粘贴中进行了编辑,以便您获得更清晰的图片。
你注意到最后我使用第一个 table 中的行的 ID 来更改第二个中的数据,所以这就是为什么(两个 [=] 中的行的 ID 相同49=]s).
当我执行此操作时,它应该将两行都保留在两个 table 中,但仅通过从 blob 列中删除其图像来更新第二个 table 中的行。
因此,在此之后我应该在第一个 table
中有 row
,在 blob 列中有图像,在第二个 table 中有相同的行,在 blob 列中没有图像。
我猜我的 sql 语法有误(也收到了一些警告),有人可以帮我改正吗?
如果要清除 blob 字段的内容,请为其赋值 NULL。
dbmodule.arhivaQuery.SQL.Add('UPDATE `database_name`.`2nd_table_name` SET `column_name` = NULL WHERE `id`=''' + inttostr(dbmodule.comenziDataSetid.Value) + ''';');
如果要为那些没有值的列显示 deleted,请在使用 IFNULL()
或检索内容时在 SELECT
语句中执行此操作COALESCE()
,以您的 DBMS 支持为准。
您可以做的另一项改进(既为了简化编码又为了防止 SQL 注入)是 停止 连接您的 SQL 并切换到使用参数。这也意味着您可以停止所有 '''
double/triple/quadruple 引用废话和数据类型转换,因为数据库驱动程序将为您处理所有这些。
dbmodule.arhivaQuery.SQL.Add('UPDATE `database_name`.`2nd_table_name` SET `column_name` = NULL WHERE `id`= :ID;');
// Use AsInteger, AsString, AsFloat, or AsBoolean, whichever fits your
// column data type. Notice no quotes, no call to IntToStr or FloatToStr.
dbmodule.arhivaQuery.ParamByName('ID').AsString := dbmodule.comenziDataSetid.Value;
注意: 某些数据库驱动程序将需要 Params.ParamByName
。一个不行,另一个行。
最后,将您的长行 SQL 分成易于管理的部分,这样您就可以停止所有滚动来阅读它。
dbmodule.arhivaQuery.SQL.Add('UPDATE `database_name`.`2nd_table_name`');
dbmodule.arhivaQuery.SQL.Add('SET `column_name` = NULL WHERE `id`= :ID;');
dbmodule.arhivaQuery.ParamByName('ID').AsString := dbmodule.comenziDataSetid.Value;
我有 2 个相同的 table(列数、名称和设置)。
我在每个 table 上有 1 个相同的行,相同的信息。
其中一列是 BLOB
类型的列并包含图像 (bmp)。
两行/tables 都有一个 id
列,auto increment
,所以 id 在两个 tables 中的每一行都是相同的。
设置为 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 来更新第二个 table 中的行,或者更确切地说,用单词 "deleted" 替换 bmp。不是,图像还在列/行中。
有几点需要澄清:
dbmodule 是包含数据集、数据源、sql 连接和查询的数据模块的名称。 (TSimpleDataSet
, TDataSource
, TSQLConnection
, TSQLQuery
).
arhivaQuery 是我正在使用的查询的名称 (a TSQLQuery
)
column_name = 列的名称,我已在此粘贴中进行了编辑,以便您获得更清晰的图片。
你注意到最后我使用第一个 table 中的行的 ID 来更改第二个中的数据,所以这就是为什么(两个 [=] 中的行的 ID 相同49=]s).
当我执行此操作时,它应该将两行都保留在两个 table 中,但仅通过从 blob 列中删除其图像来更新第二个 table 中的行。
因此,在此之后我应该在第一个 table
中有 row
,在 blob 列中有图像,在第二个 table 中有相同的行,在 blob 列中没有图像。
我猜我的 sql 语法有误(也收到了一些警告),有人可以帮我改正吗?
如果要清除 blob 字段的内容,请为其赋值 NULL。
dbmodule.arhivaQuery.SQL.Add('UPDATE `database_name`.`2nd_table_name` SET `column_name` = NULL WHERE `id`=''' + inttostr(dbmodule.comenziDataSetid.Value) + ''';');
如果要为那些没有值的列显示 deleted,请在使用 IFNULL()
或检索内容时在 SELECT
语句中执行此操作COALESCE()
,以您的 DBMS 支持为准。
您可以做的另一项改进(既为了简化编码又为了防止 SQL 注入)是 停止 连接您的 SQL 并切换到使用参数。这也意味着您可以停止所有 '''
double/triple/quadruple 引用废话和数据类型转换,因为数据库驱动程序将为您处理所有这些。
dbmodule.arhivaQuery.SQL.Add('UPDATE `database_name`.`2nd_table_name` SET `column_name` = NULL WHERE `id`= :ID;');
// Use AsInteger, AsString, AsFloat, or AsBoolean, whichever fits your
// column data type. Notice no quotes, no call to IntToStr or FloatToStr.
dbmodule.arhivaQuery.ParamByName('ID').AsString := dbmodule.comenziDataSetid.Value;
注意: 某些数据库驱动程序将需要 Params.ParamByName
。一个不行,另一个行。
最后,将您的长行 SQL 分成易于管理的部分,这样您就可以停止所有滚动来阅读它。
dbmodule.arhivaQuery.SQL.Add('UPDATE `database_name`.`2nd_table_name`');
dbmodule.arhivaQuery.SQL.Add('SET `column_name` = NULL WHERE `id`= :ID;');
dbmodule.arhivaQuery.ParamByName('ID').AsString := dbmodule.comenziDataSetid.Value;