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();
}
}
答案 0 :(得分:3)
您正在查询中添加内联文字。然后有限制:Firebird中的第一个查询文本限制为64 kB,varchar大小也有限制。
如果要向blob添加更多数据,则需要使用参数化查询将其流式传输到blob。请参阅示例:http://www.firebirdsql.org/en/net-examples-of-use/#update_text_blob_field
答案 1 :(得分:1)
我认为你达到max length of varchar(n)
type限制 - 32767字节。虽然目标字段是BLOB,但API会将值视为varchar,因为您将其作为字符串文字提供。所以解决方案应该是使用参数化查询(对不起,我不自己使用C#,因此无法提供示例)。
答案 2 :(得分:0)
可能这个大字符串对于SQL语句来说太多了。我还读过here,Firebird中的blob无法通过SQL进行写入(但我不确定这些信息是否正确)。
无论如何,您可以使用流来编写/读取blob。例如,从SO:c# - reading/writing blob from firebird,使用字节数组进行存储,但它也应该使用字符串。