language中文

System.Data.SqlClient.SqlException: 过程或函数 'proc_***' 需要参数 '@***',但未提供

visibility 540 comment 0 access_time 13 years ago

版本信息: Microsoft .NET Framework 版本:2.0.50727.3053; ASP.NET 版本:2.0.50727.3053

今天在进行一个项目的时候调用存储过程的时候遇到了下面的错误

“/***”应用程序中的服务器错误。

过程或函数 'proc_GetBillDealDetails' 需要参数 '@BDPIDs',但未提供该参数。

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: 过程或函数 'proc_GetBillDealDetails' 需要参数 '@BDPIDs',但未提供该参数。

源错误:

行 229:         catch (DbException ex)
行 230:         {
行 231:            throw ex;
行 232:         }
行 233:         finally

源文件: ****\ShowBDPDetail.aspx.cs    行: 231

堆栈跟踪:

[SqlException (0x80131904): 过程或函数 'proc_GetBillDealDetails' 需要参数 '@BDPIDs',但未提供该参数。]


而我仔细检查了下,我的参数都是添加了的,参数的类型、大小等都设置好了的,而且之前一直这样做都没遇到这样的错误,于是调试了下,原来是自己疏忽了,我习惯于用属性来读取字段的值,字段如果为空或者null则进行相关的初始化操作,对于Request.QueryString或者Form传入的数据我一般都喜欢这样做。

比如:

private string mBDPIDs;

/// <summary>
      /// BDTIDs,多个分类查询的ID组成的字符串
      /// </summary>
      public string BDPIDs
      {
         get
         {
            if (string.IsNullOrEmpty(mBDPIDs))
            {
               mBDPIDs = HttpUtility.UrlDecode(Request.QueryString["bdpIDs"], Encoding.Default);
               //Trace.Write(mBDPIDs);
            }
            return mBDPIDs;
         }
         set { mBDPIDs = value; }
      }

这样做诚然没有什么错,但是错就错在我再给DbCommand的参数赋值的时候用到的是mBDPIDs,这就导致传入的参数值为null,就出现了存储过程参数未能传入的情况。在我这种情况下只需把参数赋值改成BDPIDs
这个属性就可以了。

这个错误自己其实已经出现了两次了,所以总结在此,以防以后再出这种低级错误

info Last modified by Raymond 13 years ago copyright This page is subject to Site terms.

Subscribe newsletter

Please log in or register to comment.

account_circle Log in person_add Register

Log in with external accounts