2011-12-18 73 views
2

Firebird的文档意味着您可以将大型(> 60K)字符串写入表中的blob值。所以,如果你有这样的:是否可以向Firebird 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到字符串,这是一个有点怀疑)

我想有引用或逃跑的数据值,或者一个C#相当于一种特殊的方式这个Java代码(http://www.firebirdfaq.org/faq372/)将二进制文件直接读入语句中。我没有对文本数据做任何事情,所以我打算将它作为二进制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

你能提醒我们SUBTYPE 1是什么吗?无论如何,请尝试使用参数。 – 2011-12-18 17:51:43

+0

BLOB SUB_TYPE 1映射到C#中的字符串,而BLOB映射到字节数组。 – 2011-12-18 18:20:02

回答

0

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

无论如何,你可以使用流写/读blob。例如,从SO:c# - reading/writing blob from firebird,使用字节数组进行存储,但它也应该与字符串一起使用。

+0

我已经阅读了这两个链接 - 第一个给了我希望,实际上写一个长字符串到blob将是可能的。关于不使用SQL的部分是针对0.9.4之前版本的,所以我很好。第二个链接的答案实际上是关于如何将二进制数据写入文件 - 在这一点上,这是一个我希望得到的问题:) – 2011-12-18 18:44:18

+0

好吧,你真的尝试使用流吗? – 2011-12-18 18:46:56

+0

我不确定在C#中使用数据流写入Firebird数据库的位置 - 您能否提供链接? – 2011-12-18 18:52:25

1

我认为你打到max length of varchar(n) type限制 - 32767字节。虽然目标字段是BLOB,但API会将值作为varchar作为字符串文本提供。所以解决方案应该是使用参数化查询(对不起,我自己不使用C#,因此不能提供示例)。

相关问题