1

コードの終わりに向かって、ページから渡されたパラメーターに基づいてテーブルを更新するストアドプロシージャを呼び出しています。次のエラーが発生します。

プロシージャまたは関数'Res_invpush_UpdateInv'には、指定されていないパラメータ'@InventoryPushSubscriptionId'が必要です。

パラメータ値が正常に渡されたとしても、ブレークポイントを使用してテストしたため、これを知っています。上記のパラメータにマウスを合わせると、値が1になるため、メッセージがまだ表示される理由がわかりません。

誰かが私がどこで間違っているのか、それを修正する方法を教えてもらえますか?

SendInvUpdate.InvServices.UpdateRatePackagesRequest ur = new SendInvUpdate.InvServices.UpdateRatePackagesRequest();
    SendInvUpdate.InvServices.UpdateRatePackagesOperationResponse or = new SendInvUpdate.InvServices.UpdateRatePackagesOperationResponse();


    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            string connStr = ConfigurationManager.ConnectionStrings["bb"].ConnectionString;
            SqlConnection Con = new SqlConnection(connStr);
            Con.Open();
            SqlCommand cmd = new SqlCommand("invpush_PollForAvailableChanges", Con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter NewSysChangeVersionParam = new SqlParameter("@NewSysChangeVersion", SqlDbType.Int);
            NewSysChangeVersionParam.Value = (object)NewSysChangeVersionParam ?? DBNull.Value;
            NewSysChangeVersionParam.Direction = ParameterDirection.InputOutput;
            NewSysChangeVersionParam.SqlDbType = SqlDbType.BigInt;
            SqlDataReader sdr = cmd.ExecuteReader();

            InventoryPushSubscriptionRecord rec = new InventoryPushSubscriptionRecord();

            while (sdr.Read())
            {

                rec.InventoryPushSubId = sdr.GetInt32(0);
                rec.CMName = sdr.GetString(1);
                rec.NotifUrl = sdr.GetString(2);
                rec.Options = sdr.GetString(3);
                rec.LastSysChangeVersion = sdr.IsDBNull(4)?(long?)null:sdr.GetInt32(4);

            }

            if(!sdr.NextResult()) throw new System.Exception("Expected Result set 1 for InventoryChangeRecord");
            InventoryChangeRecord inrec = new InventoryChangeRecord();
            while (sdr.Read())
            {
                inrec.InventoryPushSubId= sdr.GetInt32(0);
                inrec.SysChangeVersion=sdr.IsDBNull(1)?(long?)null:sdr.GetInt32(1);
                inrec.InvDate=sdr.GetDateTime(2);
                inrec.ResId=sdr.GetInt32(3);
                inrec.RoomType=sdr.GetString(4);
                inrec.InvCount=sdr.GetInt32(5);
                inrec.ResName=sdr.GetString(6);

            }

            sdr.Close();
            sdr.Dispose();

            if (NewSysChangeVersionParam != null)
            {
                SendInvUpdate.InvServices.InventoryServiceClient isc = new SendInvUpdate.InvServices.InventoryServiceClient();
                        or = isc.UpdateRatePackages(request);


                        res = or.Results.ToString();
                        int Subid;
                        SubId=inrec.InventoryPushSubscriptionId;
                        SqlCommand ucmd = new SqlCommand("Res_invpush_UpdateInv", Con);
                        ucmd.CommandType = CommandType.StoredProcedure;
                        SqlParameter LastChange = new SqlParameter("@NewLastSysChangeVersion", SqlDbType.Int);
                        LastChange.Value = NewSysChangeVersionParam;
                        SqlParameter SubscriptionId = new SqlParameter("InventoryPushSubscriptionId", SqlDbType.Int);
                        SubscriptionId.Value = SubId;
                        ucmd.ExecuteNonQuery();


                    }

                }
            }                             

        }

        catch (Exception ex)
        {
            throw (ex);
        }
    }

}
4

2 に答える 2

2

コマンドオブジェクトのparametersプロパティを設定していません。コードは、

SqlCommand ucmd = new SqlCommand("Res_invpush_UpdateInv", Con);
                    ucmd.CommandType = CommandType.StoredProcedure;

                    SqlParameter LastChange = new SqlParameter("@NewLastSysChangeVersion", SqlDbType.Int);
                    LastChange.Value = NewSysChangeVersionParam;

                    SqlParameter SubscriptionId = new SqlParameter("InventoryPushSubscriptionId", SqlDbType.Int);

パラメータがコマンドオブジェクトのパラメータプロパティに割り当てられていないため、ストアドプロシージャがパラメータを取得していないことがわかります。ExecuteNonQueryステートメントの前に次を追加するだけです。

command.Parameters.Add(LastChange);
command.Parameters.Add(SubscriptionId );
于 2012-04-19T00:45:13.450 に答える
2

まず、Mikeが述べているように、パラメーターの命名に一貫性を持たせる必要があります。

例えば

SqlParameter SubscriptionId = new SqlParameter("InventoryPushSubscriptionId", SqlDbType.Int);

する必要があります

SqlParameter SubscriptionId = new SqlParameter("@InventoryPushSubscriptionId", SqlDbType.Int);

そして、@ NSGagaが指摘しているように、実際にはパラメータをコマンドに渡していないので、オブジェクトを作成するだけで、どこでも使用していません。

このような:

SqlParameter LastChange = new SqlParameter("@NewLastSysChangeVersion", SqlDbType.Int);
LastChange.Value = NewSysChangeVersionParam;
ucmd.Parameters.Add(LastChange);
SubscriptionId = new SqlParameter("@InventoryPushSubscriptionId", SqlDbType.Int);
SubscriptionId.Value = SubId;
ucmd.Parameters.Add(SubscriptionId);

お役に立てれば

于 2012-04-19T00:46:52.873 に答える