我有一个包含许多对象的列表,其中包含'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();
如何为多行创建参数化语句?
答案 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
的列进行转换,所以我必须将字节保存到字符串中,然后由我自己将其转换回来。
这不是理想的解决方案,因为我必须将字节数据保存到字符串中(不是很好的部分),但我需要一些有效的解决方案。