带有SQL Server 2005后端的VB.net Web系统。我有一个返回varchar的存储过程,我们最终得到的值不适合varchar(8000)。
我已将return参数更改为varchar(max),但如何告诉OleDbParameter.Size属性接受任何数量的文本?
作为一个具体的例子,从存储过程中获得返回参数的VB代码看起来像:
objOutParam1 = objCommand.Parameters.Add("@RStr", OleDbType.varchar)
objOutParam1.Size = 8000
objOutParam1.Direction = ParameterDirection.Output
我可以制作什么。尺寸与(最大)一起使用?
更新
回答一些问题:
出于所有意图和目的,这个文本都需要作为一个块出来。 (改变这将需要比我想做的更多的结构性工作 - 或者我的授权,真的。)
如果我没有设置大小,我会收到错误“String [6]:Size属性的大小无效。”
答案 0 :(得分:8)
你能使用ADO.NET吗?
编辑:为了澄清,我只是建议你可能要考虑ADO.NET,因为你正在使用VB.NET 2005和SQL Server 2005 - OLEDB是预先的。 NET访问数据库的方式,因此您可以通过使用ADO.NET找到更多的灵活性。
您不应该从存储过程返回VARCHAR。我甚至不确定你能不能。
但是,如果使用OUT参数,则不必按大小指定。例如:
SqlParameter p = new SqlParameter("@RStr", SqlDbType.VarChar);
p.Direction = ParameterDirection.Output;
不确定这是否符合您的需求,但它应该可以正常工作。
答案 1 :(得分:8)
Upvoted Ed Altofer。 (他首先回答,所以如果你喜欢我的回答,也可以投票)。
OleDb是你的问题。它是一个通用的数据库连接,需要与SQL Server进行通信,因此您具有最低的公分母情况,其中只能完全支持最弱的复合特征集。其中一个丢失的功能是varchar(max)支持。
您正在使用SQL Server 2005和VB.Net。是什么阻止你使用System.Data.SqlClient而不是System.Data.OleDb?
修改强>
我找到了关于这个问题的文档。见这里:
http://msdn.microsoft.com/en-us/library/ms131035.aspx
相关部分:
数据类型 varchar(max),nvarchar(max),varbinary(max),xml,udt 或其他大型对象类型的返回值无法返回到SQL Server之前的客户端版本如果您希望将这些类型用作返回值,则必须使用SQL Server Native Client。
答案 2 :(得分:4)
我认为使用-1作为大小会起作用。至少它应该与ADO.NET。像这样:
objOutParam1 = objCommand.Parameters.Add(“@ RStr”,OleDbType.varchar,-1)
这是一篇很长的文章,但在最后一个例子中显示使用-1:
答案 3 :(得分:1)
您是否尝试过不指定大小?
是否可以返回TEXT而不是VARCHAR(MAX)?
答案 4 :(得分:0)
这个大字符串是什么样的?它可能是通过附加记录集更好地返回的东西,还是只是注释文本?
答案 5 :(得分:0)
您是否尝试过指定:
objOutParam1.Size = Int32.MaxValue;
答案 6 :(得分:0)
只需使用int.MaxValue作为参数大小。 sproc中的byte []将具有正确的长度。 (我正在使用varbinary但结果将是相同的。)
param.Size = int.MaxValue;
param.SqlDbType = SqlDbType.VarBinary;
答案 7 :(得分:0)
您是否尝试使用“OleDbType.LongVarChar”,此类型映射到SQL Server 2K中的Text,并允许您检索超过8K的字符。
答案 8 :(得分:0)
-1选项效果很好。我在几种情况下使用它,我从存储过程中返回varchar(max)。
答案 9 :(得分:-1)
简短的回答是使用TEXT而不是VARCHAR(max)。 8K是数据库页面的最大大小,除了BLOB和TEXT之外,所有数据列都应该适合。这意味着,由于您的其他列,您的可用容量小于8k。
BLOB和TEXT就是Web 1.0。较大的行意味着更大的数据库复制时间和更大的文件I / O.我建议您为此维护一个带有HTTP接口的单独文件服务器。
并且,对于上一栏
DataUrl VARCHAR(255)NOT NULL,
插入新行时,首先计算数据的MD5校验和。其次,将校验和作为文件名上传到文件服务器。三,INSERT INTO ...(...,DataUrl)VALUES(...,“http://fileserver/get?id=”。md5_checksum_data)
使用此设计,即使平均数据大小变为1000倍,您的数据库也会保持冷静。