是否可以将大字符串写入Firebird blob?

Firebird的文档意味着您可以将大(> 60K)字符串写入表中的blob值。 所以,如果你有这个:

CREATE TABLE MyBlobTable ( theId int PRIMARY KEY NOT NULL, theBlob BLOB SUB_TYPE 1 ) 

那应该工作:

 insert into MyBlobTable (theId, theBlob) values (1, '[60K characters in a string]') 

(示例受http://web.firebirdsql.org/dotnetfirebird/blob-sub_type-1-reading-example-csharp.html启发)

但我发现C#驱动程序和FlameRobin都无法写入此值。 你得到’意外的命令结束’(指向字符串中大约32K的位置,这有点可疑)

我认为有一种特殊的方式来引用或转义数据值,或者可能是这个Java代码(http://www.firebirdfaq.org/faq372/)的C#等价物,其中二进制文件直接读入语句。 我没有对文本数据做任何想象,所以如果需要,我可以将它存储为二进制blob。

谢谢!

更新:“参数化查询”是我正在寻找的短语。 我在做什么:

 FbParameter param = new FbParameter("@blobVal", FbDbType.Text); param.Value = myLargeString; String query = "insert into MyBlobTable (theId, theBlob) values (1, @blobVal)"; using (FbConnection conn = [something from my pool]) { using (FbCommand cmd = new FbCommand(query, conn)) { cmd.Parameters.Add(param); cmd.ExecuteNonQuery(); } } 

您正在查询中添加内联文本。 然后有限制:Firebird中的第一个查询文本限制为64 kB,varchar大小也有限制。

如果要向blob添加更多数据,则需要使用参数化查询将其流式传输到blob。 请参阅示例: http : //www.firebirdsql.org/en/net-examples-of-use/#update_text_blob_field

我认为你正在达到varchar(n)类型限制的最大长度 – 32767字节。 虽然目标字段是BLOB,但API会将值视为varchar,因为您将其作为字符串文字提供。 所以解决方案应该是使用参数化查询(对不起,我不自己使用C#,因此无法提供示例)。

可能这个大字符串对于SQL语句来说太多了。 我还在这里读到,Firebird中的blob无法通过SQL进行写入(但我不确定这些信息是否正确)。

无论如何,您可以使用流写入/读取blob。 例如,来自SO: c# – 从firebird读取/写入blob ,使用字节数组进行存储,但它也应该与字符串一起使用。