access_time 13 years ago language中文
more_vert

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

visibility 503 comment 0

版本信息: 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.
Like this article?
Share on

Please log in or register to comment.

account_circle Log in person_add Register

Log in with external accounts

Follow Kontext

Get our latest updates on LinkedIn.

Want to contribute on Kontext to help others?

Learn more

More from Kontext