在块语句中将blob插入Firebird

时间:2016-01-18 10:56:58

标签: c# sql firebird

我有一个包含许多对象的列表,其中包含'jar cf newjar.jar javafiles' 。我想将它们作为块插入到Firebird数据库中。没有阵列,我可以这样做:

byte[8]

当我想插入blob时,我使用这样的东西:

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();

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

2 个答案:

答案 0 :(得分:2)

EXECUTE BLOCK语句可以包含参数,语法在documentation中描述:

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

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

看起来您的blob数据实际上非常小,只有8个字节,因此可能使用binary strings功能的另一种选择是:

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

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

答案 1 :(得分:0)

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