C# 什么SqlDbType映射到varBinary(max)?

C# 什么SqlDbType映射到varBinary(max)?,c#,asp.net,sql-server,types,C#,Asp.net,Sql Server,Types,什么SqlDbType映射到varBinary(max)?SqlDbType.VarBinary说它被限制为8K。SQL Server文档说明varbinary(max)可以存储aprox。2GB。但是SqlDbType.VarBinary说它被限制为8K。 这可能会有帮助: 尽管SqlDbType.Image可能很难看,但它似乎是一条出路。看起来我需要更新我的ORM,因为任何超过8k的东西都会破坏它 试试这个: SqlParameter blobParam = new SqlParameter

什么SqlDbType映射到varBinary(max)?SqlDbType.VarBinary说它被限制为8K。SQL Server文档说明varbinary(max)可以存储aprox。2GB。但是SqlDbType.VarBinary说它被限制为8K。

这可能会有帮助:

尽管SqlDbType.Image可能很难看,但它似乎是一条出路。看起来我需要更新我的ORM,因为任何超过8k的东西都会破坏它

试试这个:

SqlParameter blobParam = new SqlParameter("@blob", SqlDbType.VarBinary, buffer.Length);
blobParam.Value = buffer;
cmd.Parameters.Add(blobParam);

看看这是否有效,至少在理论上,长度为-1的SqlDbType.VarBinary是VarBinary(MAX)的等价物。但问题要复杂一点,因为还有一个类型(不是枚举值),即可以使用它。当类型具有
FILESTREAM
属性时,
VARBINARY(MAX)
类型也可以使用它

但问题是,这些枚举或类型都不能解决ADO.Net中使用
VARBINARY(MAX)
列的真正问题:内存消耗。当使用“开箱即用”时,所有这些类型都将在内存中创建作为单个数组分配的值的副本,这充其量是没有性能的,但随着内容变得越来越大,由于分配失败而变得完全无法使用。我有几篇文章介绍了在ADO.Net中使用流语义处理
VARBINARY(MAX)
值的正确方法,可以避免创建整个内容的内存副本:


出于好奇,解决方案是什么?缓冲区的类型是什么?@JohnSaunders虽然不是作者,但我在使用SqlGeometry时遇到了缓冲区。您可以从SqlGeometry类型中获取SqlBytes,因此在我的示例中,前面几行的内容如下:System.Data.SqlTypes.SqlBytes SqlBytes=sqlGeo.StatInary();byte[]buffer=sqlBytes.buffer;谢谢,@StuartQ,但这并没有告诉我
缓冲区的.NET类型。应该显示在我的最新编辑。真奇怪,上面没有为我工作。我不得不写:dtProducts.Columns.Add(newdatacolumn(“Cover”,typeof(byte[]){AllowDBNull=true});注意字节[]……这是我的工作原理。