在块语句中将 blob 插入到火鸟中

本文关键字:插入 火鸟 blob 语句 | 更新日期: 2023-09-27 18:30:58

我有一个包含许多对象的列表,其中包含byte[8]。我想将它们作为一个块插入到火鸟数据库中。没有数组,我可以这样做:

var statement = "EXECUTE BLOCK AS BEGIN ";
foreach (var item in items)
{
   statement += "INSERT INTO table (id, val) VALUES ("
                + item.id + ", " + item.val + "); ";
}
statement += "END";
new FbCommand(statement, connection, transaction).ExecuteNonQuery();

当我想插入到 blob 中时,我使用如下内容:

FbCommand fbc = new FbCommand("INSERT INTO table (id, blob) VALUES (@id, @blob)", connection, transaction);
fbc.Parameters.Add("@id", FbDbType.BigInt).Value = id;
fbc.Parameters.Add("@blob", FbDbType.Binary).Value = blob;
fbc.ExecuteNonQuery();

如何为多行创建参数化语句?

在块语句中将 blob 插入到火鸟中

EXECUTE BLOCK语句可以有参数,语法在文档中描述:

EXECUTE BLOCK(blobVal BLOB = ?) AS BEGIN
  INSERT INTO table (id, val) VALUES (1, :blobVal);
END

缺点是你必须"线性化"你的参数,即如果你有很多行,你将有许多参数的语句(你必须在另一个循环中分配,所以代码可能很难遵循)。

看起来你的 blob 数据实际上非常小,只有 8 个字节,所以也许一个可接受的替代方法是使用二进制字符串功能:

EXECUTE BLOCK AS BEGIN
  INSERT INTO table (id, val) VALUES (1, x'01234567890ABCDEF');
END

这将允许您在循环中创建 EXECUTE BLOCK 语句,就像在第一个代码示例中一样(即保持简单)。

由于我只需要保存 8 个字节并且我需要一些解决方案,因此我最终将字节转换为字符串(转换为十六进制字符串 - 每个字节转换为两个字符)。我受到接受的答案的启发。
我这样做是因为 C# 的 Firebird 库不支持从定义为 myColumn CHAR(8) CHARACTER SET OCTETS 的列进行转换,所以我必须将字节保存到字符串中,然后自己将它们转换回来。
这不是理想的解决方案,因为我必须将字节数据保存到字符串中(不是很好的部分),但我需要一些有效的解决方案。