【问题标题】:Can't get it! SqlParameter with ParameterName is not contained by this SqlParameterCollection. Stored proc param拿不到!此 SqlParameterCollection 不包含具有 ParameterName 的 SqlParameter。存储过程参数
【发布时间】:2013-03-14 11:11:57
【问题描述】:

我知道这个问题已经被问过很多次了,我已经阅读了很多很多答案,但我无法弄清楚哪里出了问题。已经好几个小时了。任何帮助将不胜感激。我只是想在 ASP 页面中调用存储过程,但无法正确添加参数,出现不在集合中的异常。

我已按如下方式修改了我的 proc 以使其变得简单并隔离问题。

 ALTER PROCEDURE [dbo].[up_validateUserWithClinicCount]     
@HTID       INT = 0,
@ValidUserID    INT OUTPUT,
@MultiClinicFlag    INT OUTPUT
AS
DECLARE @vClinicCount   INT = null
DECLARE @vUserValid     INT = null
BEGIN

SET @ValidUserID = 2
SET @MultiClinicFlag = 1
END;

和 C# 代码

String connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["PC3PaymentConnection"].ConnectionString;
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            using (SqlCommand cmd = new SqlCommand("up_validateUserWithClinicCount", connection))
            {

                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.AddWithValue("@HTID", htId);

                SqlParameter uidOut = new SqlParameter("@ValidUserID", SqlDbType.Int);
                uidOut.Size = 4;
                uidOut.Direction = ParameterDirection.Output;
                cmd.Parameters.Add(uidOut);

                SqlParameter pMultiClinics = new SqlParameter();
                pMultiClinics.ParameterName = "@MultiClinicFlag";
                pMultiClinics.SqlDbType = SqlDbType.Int;
                pMultiClinics.Direction = ParameterDirection.Output;
                cmd.Parameters.Add(pMultiClinics);

                try
                {
                    cmd.ExecuteNonQuery();
    //--> Error points to the next line, and I have tried to use int.parse rather than convert   also, with the same error -- parameter not in collection
                    MultiClinics = Convert.ToInt16(cmd.Parameters["pMultiClinics"].Value);
                    PC3User = Convert.ToInt16(uidOut.Value.ToString());
                }
                catch (SqlException sqlEx)
                {
                    LbMsg.ForeColor = System.Drawing.Color.Red;
                    LbMsg.Text = sqlEx.Message;
                }
            }
        }

谢谢你能看到我遗漏的东西。

【问题讨论】:

  • 你在执行后使用@pMultiClinics 而不是 cmd.Parameters["pMultiClinics"].Value 的 ID。
  • 该参数未调用"pMultiClinics"。它叫"@MultiClinicFlag"

标签: c# asp.net stored-procedures


【解决方案1】:

你已经有一个参数的对象引用,你不需要从参数集合中获取它。此外,sql int 是 32 位的。

MultiClinics = (int)pMultiClinics.Value;

要从参数集合中检索,请使用您提供的 ParameterName:

MultiClinics = (int)cmd.Parameters["@MultiClinicFlag"].Value;

【讨论】:

  • 哇,对不起。我对此感到非常疲倦并且非常陌生,但仍然是非常愚蠢的错误。谢谢你的帮助。就是这样。
  • 在 c# 中是 int32,在数据库中是 int。现在没问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
相关资源
最近更新 更多