2012-04-19 3 views
1

К концу моего кода я вызываю хранимую процедуру, которая обновляет таблицу на основе параметров, переданных моей страницей. Я получаю следующее сообщение об ошибке:Процедура ожидает параметр, который не был отправлен

Procedure or function 'Res_invpush_UpdateInv' expects parameter '@InventoryPushSubscriptionId', which was not supplied.

Даже думал, что мое значение параметра успешно прошло - я знаю это, потому что я испытал с помощью контрольных точек, и когда я мыши над на параметре упомянуто, что дает значение 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); 
     } 
    } 

} 
+0

TL; DR. Пожалуйста, упростите этот пример. Делает помощь легче. – usr

+0

Никто не хочет тралить через такое количество кода. http://www.sscce.org – spender

+0

Вы несовместимы в своем параметре, именовав его внешний вид. Некоторые из ваших параметров передаются из вашего кода C# с помощью «@», а некоторые - нет. Я подозреваю, что ваша проблема в том, что вы перекрестились с этим параметром. –

ответ

2

Прежде всего, как отмечает Майк, вы должны быть совместимы с наименованием параметра.

например.

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

Надеется, что это помогает

2

Вы не устанавливая свойство параметров для объекта команды, ваш код,

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); 
Смежные вопросы