C# 在block语句中将blob插入Firebird

C# 在block语句中将blob插入Firebird,c#,sql,firebird,C#,Sql,Firebird,我有一个包含许多对象的列表,其中包含字节[8]。我想将它们作为块插入Firebird数据库。如果没有阵列,我可以这样做: var statement = "EXECUTE BLOCK AS BEGIN "; foreach (var item in items) { statement += "INSERT INTO table (id, val) VALUES (" + item.id + ", " + item.val + "); "; } statem

我有一个包含许多对象的列表,其中包含字节[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();
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时,我使用如下方式:

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();
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语句可以有参数,语法描述如下:

缺点是必须对参数进行线性化,也就是说,如果有许多行,那么语句中就有许多参数,必须在另一个循环中分配这些参数,因此代码可能很难理解

看起来您的blob数据实际上非常小,只有8个字节,所以可能可以接受的替代方法是使用以下功能:


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

因为我只需要保存8个字节,并且我需要一些解决方案,所以我最终将字节转换为字符串到十六进制字符串-每个字节转换为两个字符。我被公认的答案所鼓舞。 我这样做是因为C的Firebird库不支持从定义为myColumn CHAR8字符集八位字节的列转换,所以我必须将字节保存到字符串中,然后自己将它们转换回来。
这不是理想的解决方案,因为我必须将字节数据保存到字符串中,这不是一个好的部分,但我需要一些有效的解决方案。

是的,执行块可以有参数,但它会有很多参数,您已经编写了缺点。二进制字符串看起来很有前途。我试试看。它需要转换为字符串和后缀,但是因为没有限制,比如在字符串的中间插入00,它应该是好的。它用于保存,并且我也可以在FlameRobin中创建SELECT,就像在您所张贴的第二个链接中所写的那样。但如何将这些数据返回到C应用程序?当我基于其他值进行行选择时,它会返回一些不好的字符串,我无法将其转换回原始字节。因此,不要将其作为字符串读回,而是作为二进制blob读回。另外,DB字段的定义类型、字符集是怎样的呢?我试着这样定义列:myColumn CHAR8。也许我不太明白。我不确定我是否能够定义如何从这个列字节而不是字符串中获取列值。对于二进制数据,应该使用BLOB SUB_类型0。在您的情况下,如果您的数据从未超过8个字节,那么使用blob将是过分的,因此使用CHAR8字符集OctetsTesting,我认为Firebird.net提供程序确实支持OCTETS字段。我看看能不能为你找到更好的解决办法。