在块语句中将 blob 插入 Firebird
Insert blob into Firebird in block statement
我有一个包含许多对象的列表,其中包含 byte[8]
。我想将它们作为一个块插入到 Firebird 数据库中。没有数组我可以这样做:
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();
如何为多行创建参数化语句?
EXECUTE BLOCK
语句可以带参数,语法见documentation:
EXECUTE BLOCK(blobVal BLOB = ?) AS BEGIN
INSERT INTO table (id, val) VALUES (1, :blobVal);
END
缺点是你必须 "linearize" 你的参数,即如果你有很多行,你将有很多参数的语句(你必须在另一个循环中分配,所以代码可以是很难理解)。
看来您的 blob 数据实际上很小,只有 8 个字节,所以也许可以接受的替代方法是使用 binary strings 功能:
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
的列进行转换,所以我必须将字节保存到字符串中,然后自己将它们转换回来。
这不是理想的解决方案,因为我必须将字节数据保存到字符串中(不是很好的部分),但我需要一些可行的解决方案。
我有一个包含许多对象的列表,其中包含 byte[8]
。我想将它们作为一个块插入到 Firebird 数据库中。没有数组我可以这样做:
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();
如何为多行创建参数化语句?
EXECUTE BLOCK
语句可以带参数,语法见documentation:
EXECUTE BLOCK(blobVal BLOB = ?) AS BEGIN
INSERT INTO table (id, val) VALUES (1, :blobVal);
END
缺点是你必须 "linearize" 你的参数,即如果你有很多行,你将有很多参数的语句(你必须在另一个循环中分配,所以代码可以是很难理解)。
看来您的 blob 数据实际上很小,只有 8 个字节,所以也许可以接受的替代方法是使用 binary strings 功能:
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
的列进行转换,所以我必须将字节保存到字符串中,然后自己将它们转换回来。
这不是理想的解决方案,因为我必须将字节数据保存到字符串中(不是很好的部分),但我需要一些可行的解决方案。