【问题标题】:Procedure or function 'spGetCountryByNames' expects parameter '@countryName', which was not supplied过程或函数“spGetCountryByNames”需要参数“@countryName”,但未提供该参数
【发布时间】:2016-01-01 21:07:57
【问题描述】:

当我通过 .net 调用带有参数的 SQL Server 存储过程时会发生这种情况,即使我提供了参数。

这是我的存储过程代码:

create procedure spGetCityByNames
    @cityName char(10)
as
begin
    select * 
    from tblCity
    where cityName like @cityName + '%'
end

还有我的 .net 代码:

SqlCommand cmd = new SqlCommand("spGetCityByNames", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;

cmd.Parameters.AddWithValue("@cityName", TextBox1.Text + "%");

con.Open();
GridView1.DataSource = cmd.ExecuteReader();
GridView1.DataBind();
con.Close();

【问题讨论】:

  • 欢迎来到 Stack Overflow。显示您的spGetCountryByNames 程序,而不是spGetCityByNamesthat 过程中的错误消息点。请阅读FAQHow to Ask 作为开始..
  • 使用 varchar(10) 怎么样?
  • 抱歉,我先在国家/地区尝试过,然后在城市中尝试过。。
  • 错误消息:过程或函数“spGetCityByNames”需要参数“@cityName”,但未提供
  • 我还检查了 spGetCityByNames 'd%' 是否返回 NULL,即使城市是用 'd' 字母列出的......为什么会这样??

标签: c# .net sql-server stored-procedures


【解决方案1】:

下面的代码行% 是不必要的,因为您已经将它包含在您的过程代码where cityName like @cityName + '%' 中。应该只是

cmd.Parameters.AddWithValue("@cityName", TextBox1.Text.Trim());

另外,尝试使用VARCHAR 代替CHAR 并使用cmd.Parameters.Add() 方法代替AddWithValue()

将您的 proc 代码更改为 VARCHAR 喜欢

create procedure spGetCityByNames
@cityName varchar(10)
as
begin
    select * from tblCity
    where cityName like @cityName + '%'
end

在代码后面有

cmd.Parameters.Add("@cityName", SqlDbType.VarChar, 10).Value = TextBox1.Text.Trim();

编辑:

根据@fabio 的评论,不,这不是对代码的全部重构。我的猜测以及我修改程序和使用Add()函数的原因是:

OP 的参数为 char(10) 类型列,并且正在使用 AddWithValue() 方法。 AddWithValue() 有一个缺点,它必须即时推断参数的类型,并且由于数据来自文本框控件,因此大多数情况下它将推断类型为nvarchar。据我猜测,那里发生了一些奇怪的事情,因此问题浮出水面。

我知道我的猜测/解释与确切的错误消息不匹配,这是一个经过计算的猜测,但看看是什么,它按我的预期工作。

【讨论】:

  • @Rahul,你能解释一下为什么抛出“缺少参数”异常,甚至添加了同名的参数吗?您的回答似乎更像是重构 OP 的代码
  • @Fabio,不,不完全是。如果有帮助,请参阅答案中的编辑。
猜你喜欢
  • 2020-12-14
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多