zl程序教程

您现在的位置是:首页 >  后端

当前栏目

subsonic3.0插件更新字符串过长引发的异常修复方法

方法异常插件 修复 字符串 更新 引发 过长
2023-06-13 09:15:24 时间

最近公司客服提交了个BUG,说是更新产品详细信息时,有的可以有的更新不了,前段时间一直没空所以暂时放下,刚才又出现这个问题,所以马上处理了一下。


打开项目解决方案,进入DEBUG模式,拿到操作的数据提交后进行追踪,发现提交时产生了:System.Data.SqlClient.SqlException(0x80131904):传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。参数4("@up_xxx"):数据类型0xA7的数据长度或元数据长度无效。

百度一下发现是由于更新字符串过长引发的异常,必须将参数的Size设置为-1才行,所以按下图处理

复制代码代码如下:


privatestaticvoidAddParams(DbCommandcmd,QueryCommandqry)
       {
           if(qry.Parameters!=null)
           {
               foreach(QueryParameterparaminqry.Parameters)
               {
                   DbParameterp=cmd.CreateParameter();
                   p.ParameterName=param.ParameterName;
                   p.Direction=param.Mode;
                   p.DbType=param.DataType;
                   /*
                    *修改人:Empty(AllEmpty)
                    *修改说明:修改提交的字符串长度过长产生的Bug
                    *异常信息:System.Data.SqlClient.SqlException(0x80131904):传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。
                    *          参数4("@up_xxx"):数据类型0xA7的数据长度或元数据长度无效。
                    *********************************************/
                   if(param.DataType.ToString()=="AnsiString")
                   {
                       p.Size=-1;
                   }

                   //outputparametersneedtodefineasize
                   //ourdefaultis50
                   if(p.Direction==ParameterDirection.Output||p.Direction==ParameterDirection.InputOutput)
                       p.Size=param.Size;

                   //fixforNULLsasparametervalues
                   if(param.ParameterValue==null)
                   {
                       p.Value=DBNull.Value;
                   }
                   elseif(param.DataType==DbType.Guid)
                   {
                       stringparamValue=param.ParameterValue.ToString();
                       if(!String.IsNullOrEmpty(paramValue))
                       {
                           if(!paramValue.Equals("DEFAULT",StringComparison.InvariantCultureIgnoreCase))
                               p.Value=newGuid(paramValue);
                       }
                       else
                           p.Value=DBNull.Value;
                   }
                   else
                       p.Value=param.ParameterValue;

                   cmd.Parameters.Add(p);
               }
           }
       }