【问题标题】:Program doesn't send parameters to stored procedure程序不向存储过程发送参数
【发布时间】:2014-04-26 09:31:43
【问题描述】:

我编写了一个程序,该程序根据ID 从gridview 中选择并删除一行,但它引发了一个异常,即@ComplainantTypeID 没有提供给存储过程,但我检查了调试,它发送并添加了值,但是它仍然抛出异常。

代码:

protected void btnDeletePopUp_Click(object sender, EventArgs e)
{
        try
        {
            int ComplainantTypeID = Convert.ToInt32(txtSelectedID.Text.Trim());
            ManageComplainantType mngComplainantType = new ManageComplainantType();
            mngComplainantType.Delete(ComplainantTypeID);
            Clear(txtName, txtSelectedID);
            HiddenFieldSetMessage.Value = "Delete";
            HiddenFieldShowMessage.Value = "True";
        }
        catch (Exception)
        {
            HiddenFieldSetMessage.Value = "NotDeleted";
            HiddenFieldShowMessage.Value = "True";
        }
    }

删除 BLL 中的函数:

public void Delete(int ComplainantTypeID)
{
            SqlCommand cmd = new SqlCommand("DeleteComplainantTypes_SP", DataBaseConnection.OpenConnection());
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter pComplainantTypeID = new SqlParameter("@ComplainantTypeID", ComplainantTypeID);
            cmd.Parameters.Add(pComplainantTypeID);
            cmd.ExecuteNonQuery();
            DataBaseConnection.CloseConnection();
}

存储过程:

PROCEDURE [dbo].[DeleteComplainantTypes_SP]
    @ComplainantTypeID smallint
AS
BEGIN
   BEGIN TRY
       DELETE FROM ComplainantTypes WHERE ComplainantTypeID = @ComplainantTypeID
   END TRY
   BEGIN CATCH
       SELECT ERROR_MESSAGE() AS ErrorMessage
   END CATCH
END

【问题讨论】:

  • 您可以尝试将 proc 参数名称更改为 @test 并在代码中使用相同的名称并检查。也只需像这样传递值 SqlParameter("@test", 1);看看你是否仍然得到同样的错误。我在本地尝试了你的代码,它对我来说很好。
  • 你可以试试 cmd.Parameters.AddWithValue("@ComplainantTypeID", 1);删除 SqlParameter 行
  • @Rishikesh 是的,先生,它起作用了,但是为什么呢?
  • 当您这样编写时,.net 运行时似乎无法映射数据类型。我认为这段代码也可以工作 SqlParameter pComplainantTypeID = new SqlParameter("@ComplainantTypeID",SqlDbType.SmallInt,value);我已将此添加为答案,请接受

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


【解决方案1】:

试试

cmd.Parameters.AddWithValue("@ComplainantTypeID", value);

SqlParameter pComplainantTypeID = new SqlParameter("@ComplainantTypeID",SqlDbType.SmallInt,value);

【讨论】:

    【解决方案2】:

    您必须显示异常以获得更好的帮助,但问题实际上出在数据类型上。你通过了int,但预期的是smallint。查看SQL Server Data Type Mappings 文章选择合适的数据类型。

    更新

    您不能将 int 转换为 smallint,您必须传递映射到 smallint sql 类型的 short 类型的参数。

    声明

    public void Delete(short ComplainantTypeID)
    

    而不是

    public void Delete(int ComplainantTypeID)
    

    并保持SP不变。

    【讨论】:

    • 错误:存储过程除了未提供的@ComplainantTypeID
    • 在这种情况下,它会给出“将数据类型 int 转换为 smallint 时出错”错误
    【解决方案3】:

    试试这个

     sqlCommand.Parameters.Add("@ComplainantTypeID", SqlDbType.Int).Value = ComplainantTypeID;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多