当前位置:  开发笔记 > 编程语言 > 正文

过程需要未提供的参数

如何解决《过程需要未提供的参数》经验,为你挑选了5个好方法。

我在访问SQL Server中的存储过程时遇到错误

Server Error in '/' Application.
Procedure or function 'ColumnSeek' expects parameter '@template', which was not supplied. 

当我通过.net的数据连接调用带有参数的存储过程时(System.data.SqlClient),即使我提供了参数,也会发生这种情况.这是我的代码.

SqlConnection sqlConn = new SqlConnection(connPath);
sqlConn.Open();

//METADATA RETRIEVAL
string sqlCommString = "QCApp.dbo.ColumnSeek";
SqlCommand metaDataComm = new SqlCommand(sqlCommString, sqlConn);
metaDataComm.CommandType = CommandType.StoredProcedure;
SqlParameter sp = metaDataComm.Parameters.Add("@template",SqlDbType.VarChar,50);
sp.Value = Template;

SqlDataReader metadr = metaDataComm.ExecuteReader();

我的存储过程是:

   USE [QCApp]
   GO
   SET ANSI_NULLS ON
   GO
   SET QUOTED_IDENTIFIER ON
   GO

   ALTER PROCEDURE [dbo].[ColumnSeek] 
       @template varchar(50)
   AS
   EXEC('SELECT Column_Name, Data_Type 
   FROM [QCApp].[INFORMATION_SCHEMA].[COLUMNS] 
   WHERE TABLE_NAME = ' + @template);

我想知道我在这里做错了什么.

编辑:事实证明,模板是null因为我从通过URL传递的参数获取其值,我搞砸了url param传递(我正在使用@for而不是&)



1> Brian..:

除了这里的其他答案,如果你忘了放:

cmd.CommandType = CommandType.StoredProcedure;

然后你也会得到这个错误.


这是我想象中99%的人来到这里的解决方案
是的,SqlException很奇怪-它告诉您它知道它是一个过程,但是您必须设置它的CommandType属性才能告诉它它是一个过程!

2> HLGEM..:

我会查看我的应用程序代码,看看你将@template设置为什么值.我怀疑它是空的,其中存在问题.


我可以补充一点,DbNull是C#的单个最无用的"功能"

3> Xcalibur..:

这个问题确实通常是由于将参数值设置为null而引起的,如上所述的HLGEM.我想我会详细说明这个问题的一些解决方案,我发现这对这个问题的新用户有益.

我更喜欢的解决方案是将存储过程参数默认为NULL(或任何你想要的值),这是上面的sangram提到的,但可能会错过,因为答案非常详细.有点像:

CREATE PROCEDURE GetEmployeeDetails
    @DateOfBirth    DATETIME = NULL,
    @Surname        VARCHAR(20),
    @GenderCode     INT = NULL,
AS

这意味着如果参数最终在某些条件下在代码中设置为null,则.NET将不会设置参数,然后存储过程将使用它已定义的默认值.另一个解决方案,如果你真的想在代码中解决问题,那就是使用一个为你解决问题的扩展方法,例如:

public static SqlParameter AddParameter(this SqlParameterCollection parameters, string parameterName, T value) where T : class
{
    return value == null ? parameters.AddWithValue(parameterName, DBNull.Value) : parameters.AddWithValue(parameterName, value);
}

Matt Hamilton 在这里有一篇很好的文章,列出了处理这个领域时更好的扩展方法.



4> Anders Rune ..:

我有一个问题,当我向整数参数提供0时,我会得到错误.并发现:

cmd.Parameters.AddWithValue("@Status", 0);

有效,但这不是:

cmd.Parameters.Add(new SqlParameter("@Status", 0));


第二个不起作用的原因是因为编译器认为你正在调用SqlParameter构造函数的*(string,SqlDbType)*重载.见[此处]备注(http://msdn.microsoft.com/en-us/library/0881fz2y(v = vs.110).aspx).

5> rafoo..:

就我而言,我必须DBNULL.Value从代码中传递(如果使用else条件,则使用)未定义null但值是的 存储过程参数null

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有