我在访问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而不是&
)
除了这里的其他答案,如果你忘了放:
cmd.CommandType = CommandType.StoredProcedure;
然后你也会得到这个错误.
我会查看我的应用程序代码,看看你将@template设置为什么值.我怀疑它是空的,其中存在问题.
这个问题确实通常是由于将参数值设置为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 在这里有一篇很好的文章,列出了处理这个领域时更好的扩展方法.
我有一个问题,当我向整数参数提供0时,我会得到错误.并发现:
cmd.Parameters.AddWithValue("@Status", 0);
有效,但这不是:
cmd.Parameters.Add(new SqlParameter("@Status", 0));
就我而言,我必须DBNULL.Value
从代码中传递(如果使用else条件,则使用)未定义null
但值是的 存储过程参数null
。