1

私はこの質問が何度も聞かれたことを知っています、そして私は多くの答えを読みました、それでも私は何が悪いのか理解できません。何時間も経ちました。どんな助けでも大歓迎です。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;

AND 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;
                }
            }
        }

私が欠けているものを見ることができればありがとう。

4

1 に答える 1

2

パラメータのオブジェクト参照はすでにあります。パラメータコレクションから取得する必要はありません。また、sqlintは32ビットです。

MultiClinics = (int)pMultiClinics.Value;

パラメータコレクションから取得するには、指定したParameterNameを使用します。

MultiClinics = (int)cmd.Parameters["@MultiClinicFlag"].Value;
于 2013-03-14T03:11:57.723 に答える