使用-1作为输出SqlParameter的大小来检索VARBINARY(max)值是正确的吗?

时间:2015-05-04 12:42:24

标签: tsql ado.net varbinary sqlparameters

我的存储过程包含OUTPUT类型的varbinary(MAX)参数:

ALTER PROCEDURE [dbo].[StoredProcedure1]
  ...
  @FileData varbinary(MAX) OUTPUT
AS
...

我不知道返回数据的实际大小是多少,因此我无法为size构造函数的SqlParameter参数使用精确值。另一方面,实际尺寸可能超过8 Kb(如果重要的话)。

当我创建SqlParameter而未声明大小时:

        var fileDataParameter = new SqlParameter("@FileData", SqlDbType.VarBinary)
            { Direction = ParameterDirection.Output };

        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add(fileDataParameter);

        command.ExecuteNonQuery();

        var fileData = fileDataParameter.Value as byte[];

我在command.ExecuteNonQuery()行上收到以下异常:

  

附加信息:字节[] [0]:Size属性无效   大小为0。

所以我需要指定size。有人建议将-1作为大小的值传递:

            var fileDataParameter = new SqlParameter("@FileData", SqlDbType.VarBinary, -1)
                { Direction = ParameterDirection.Output };

但我无法在MSDN page或其他任何地方找到对此事情的可靠描述。

就我而言,@FileData参数中返回的最大数据大小不超过10 Mb。

所以问题是如果将-1作为SqlParameter映射到varbinary(MAX) OUTPUT参数的大小传递给<script> // open popup window "dialog" $(function() { $( "#dialog" ).dialog({ autoOpen: false , width: 1000, buttons: { "Quelle hinzufügen": function() { var out = [document.getElementById("titelin"),document.getElementById("autorin"),document.getElementById("tagsin"),document.getElementById("linkin")]; var outv = [out[0].value,out[1].value,out[2].value,out[3].value]; ajax(outv); }, Abbrechen: function() { $( this ).dialog( "close" ); } } }); $( "#opener" ).click(function(e) { e.preventDefault(); $( "#dialog" ).dialog("open"); }); }); // posting to PHP function ajax(outv){ $.ajax({ type:"POST", url:"quellenverzeichnis.php", data: {output: outv}, sucess: function(){ alert("works"); }, error: function(){ alert("fail"); } }); }; </script> 参数是正确的方法,例如,来自绩效观点?

1 个答案:

答案 0 :(得分:2)

这是MSDN文档。 https://msdn.microsoft.com/en-us/library/bb399384.aspx - 参见&#34;使用大值类型参数&#34;节

传递&#34; -1&#34;对于&#34; MAX&#34;是正确的方法。价值大小。由于它是一个VarChar,它不会添加或返回任何额外的字符,只有您在该列中设置的字符。所以它应该非常有效。