【问题标题】:Error executing Stored Procedure with Parameters from C# [duplicate]使用 C# 中的参数执行存储过程时出错 [重复]
【发布时间】:2018-07-26 11:09:24
【问题描述】:

如果我在我的服务器上执行它并使用我的参数构建一个执行语句(例​​如 string sql = "Exec Get_Data '" + St + " ' ..." . 但是,一旦我尝试:

string strQS = "Exec Get_Data @param1,@param2,@param3,@param4..."

using (SqlConnection conSQL = new SqlConnection(connectionString))
{
    using (SqlCommand cmdSQL = new SqlCommand(strQS, conSQL))
    {
        conSQL.Open();

        cmdSQL.Parameters.AddWithValue("@param1", SqlDbType.VarChar).Value = St;
        cmdSQL.Parameters.AddWithValue("@param2", SqlDbType.VarChar).Value = Loc;
        ...

我收到以下错误:

列名或提供的值的数量与表定义不匹配。

显然,如果我可以在使用参数化查询之前运行它,我的列名没有任何问题,但我的值如何被处理。我所有的变量都是字符串类型,SQL Server 期望所有参数都是varchar...有什么想法吗?

【问题讨论】:

  • 显示整个代码。您是否将命令类型设置为存储过程?您在其他参数名称中有错字吗?我们所能做的就是用您向我们展示的有限数量进行猜测。请提供minimal reproducible example

标签: c# sql-server


【解决方案1】:

您需要将命令类型更改为StoredProcedure

然后从字符串中删除 EXEC 和所有参数。

cmdSQL.CommandType = CommandType.StoredProcedure;
string strQS = "Get_Data"

【讨论】:

  • 不,他没有。您可以以这种方式使用 CommandType.StoredProcedure,在这种情况下,您不需要在命令字符串中使用 Exec 关键字和参数占位符:只需过程名称。这甚至可以通过回避 SQL 字符串中的占位符与添加到 SqlCommand 的参数对象之间的不匹配来修复他的错误消息。但你不必这样做。您也可以保留默认的 CommandType。只不过你还需要Exec关键字和参数占位符作为sql字符串的一部分。
  • @JoelCoehoorn 是真的。但这就像使用动态 sql 执行存储过程一样,只是增加了不必要的混乱层。
猜你喜欢
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多