Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 过程需要一个未提供的参数_C#_Parameter Passing_Sqlexception_Sqlparameter - Fatal编程技术网

C# 过程需要一个未提供的参数

C# 过程需要一个未提供的参数,c#,parameter-passing,sqlexception,sqlparameter,C#,Parameter Passing,Sqlexception,Sqlparameter,在代码的末尾,我调用了一个存储过程,它根据页面传递的参数更新一个表。我得到以下错误: 过程或函数“Res\u invpush\u UpdateInv”需要参数“@inventorypussubscriptionid”,但未提供该参数 即使我的参数值被成功传递了,我也知道这一点,因为我已经使用断点进行了测试,当我将鼠标移到提到的参数上时,它给出的值为1,所以我不知道消息为什么仍然会出现 有人能告诉我到底哪里出了问题,或者如何解决吗 SendInvUpdate.InvServices.UpdateR

在代码的末尾,我调用了一个存储过程,它根据页面传递的参数更新一个表。我得到以下错误:

过程或函数“Res\u invpush\u UpdateInv”需要参数“@inventorypussubscriptionid”,但未提供该参数

即使我的参数值被成功传递了,我也知道这一点,因为我已经使用断点进行了测试,当我将鼠标移到提到的参数上时,它给出的值为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);
        }
    }

}

您没有为命令对象设置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);
您可以看到,参数未指定给命令对象的参数属性,因此存储过程无法获取参数。只需在ExecuteOnQuery语句之前添加以下内容

command.Parameters.Add(LastChange);
command.Parameters.Add(SubscriptionId );

您没有为命令对象设置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);
您可以看到,参数未指定给命令对象的参数属性,因此存储过程无法获取参数。只需在ExecuteOnQuery语句之前添加以下内容

command.Parameters.Add(LastChange);
command.Parameters.Add(SubscriptionId );

首先,正如Mike提到的,您应该与参数命名保持一致

e、 g

应该是

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);

希望这对您有所帮助。首先,正如Mike提到的,您应该与参数命名保持一致

e、 g

应该是

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);

希望这有帮助

TL;博士,请简化这个例子。使获得帮助变得更容易。没有人愿意浏览如此多的代码。从外观上看,您的参数命名不一致。有些参数是使用“@”从C#代码中传递的,有些则不是。我怀疑您的问题是您在该参数上交叉了它们。您可能需要传递参数,例如
command.parameters.Add(param)
再次-您不会在任何地方将
SqlParameter SubscriptionId
添加到您的命令中;博士,请简化这个例子。使获得帮助变得更容易。没有人愿意浏览如此多的代码。从外观上看,您的参数命名不一致。有些参数是使用“@”从C#代码中传递的,有些则不是。我怀疑您的问题是您在该参数上交叉了它们。您可能需要再次传递参数,例如
command.parameters.Add(param)
——您不会在任何地方将
SqlParameter SubscriptionId
添加到您的命令中