2016-03-11 3 views
0

У меня есть этот код здесь:SQL Server: хранимые процедуры и ASP.NET

public List<CellModel> PostScheduledTasks(List<CellModel> cells) 
{ 
    var sortedCells = cells.OrderBy(c => c.sortOrder).ToList(); 

    try 
    { 
     using (connection = new SqlConnection(connectionString)) 
     { 
      connection.Open(); 

      using (SqlCommand command = new SqlCommand("PostScheduledTasks", connection)) 
      { 
       command.CommandType = CommandType.StoredProcedure; 

       for (int i = 0; i < sortedCells.Count; i++) 
       { 
        SqlParameter parameter1 = new SqlParameter("@actualStart", SqlDbType.DateTime); 
        parameter1.Value = sortedCells[i].actualDate; 
        parameter1.Direction = ParameterDirection.Input; 
        command.Parameters.Add(parameter1); 

        SqlParameter parameter2 = new SqlParameter("@actualFinish", SqlDbType.DateTime); 
        parameter2.Value = sortedCells[i].finishedDate; 
        parameter2.Direction = ParameterDirection.Input; 
        command.Parameters.Add(parameter2); 

        SqlParameter parameter3 = new SqlParameter("@actualEndDate", SqlDbType.DateTime); 
        parameter3.Value = sortedCells[i].finishedDate; 
        parameter3.Direction = ParameterDirection.Input; 
        command.Parameters.Add(parameter3); 

        SqlParameter parameter4 = new SqlParameter("@UserDate1", SqlDbType.DateTime); 
        parameter4.Value = sortedCells[i].scheduledDate; 
        parameter4.Direction = ParameterDirection.Input; 
        command.Parameters.Add(parameter4); 

        SqlParameter parameter5 = new SqlParameter("@IsCompleted", SqlDbType.Bit); 
        parameter5.Value = (sortedCells[i].selected == true) ? 1 : 0; 
        parameter5.Direction = ParameterDirection.Input; 
        command.Parameters.Add(parameter5); 

        SqlParameter parameter6 = new SqlParameter("@PercentComplete", SqlDbType.Float); 
        parameter6.Value = (sortedCells[i].selected == true) ? 1 : 0; 
        parameter6.Direction = ParameterDirection.Input; 
        command.Parameters.Add(parameter6); 

        SqlParameter parameter7 = new SqlParameter("@UStmp", SqlDbType.VarChar); 
        parameter7.Value = sortedCells[i].completedBy; 
        parameter7.Direction = ParameterDirection.Input; 
        command.Parameters.Add(parameter7); 

        SqlParameter parameter8 = new SqlParameter("@ScheduleTaskID", SqlDbType.Int); 
        parameter8.Value = sortedCells[i].scheduleTaskID; 
        parameter8.Direction = ParameterDirection.Input; 
        command.Parameters.Add(parameter8); 

        SqlParameter parameter9 = new SqlParameter("@SortOrder", SqlDbType.Int); 
        parameter9.Value = sortedCells[i].sortOrder; 
        parameter9.Direction = ParameterDirection.Input; 
        command.Parameters.Add(parameter9); 

        command.ExecuteNonQuery(); 
       } 

       UserModel userModel = new UserModel(); 
       userModel.name = "true"; 
       userModel.userName = "true"; 

       return cells; 
      } 
     } 
    } 
    catch(Exception e) 
    { 
     var error = e.Message.ToString(); 

     UserModel nullModel = new UserModel(); 
     nullModel.name = "true"; 
     nullModel.userName = "true"; 

     return cells; 
    } 
    finally 
    { 
     connection.Close(); 
    } 
} 

И у меня есть 3 вещи класса. Когда он делает петлю в первый раз, все работает, как ожидалось, но после того, как во второй раз по петле, я получаю эту ошибку:

Procedure or function PostScheduledTasks has too many arguments specified.

Должен ли я очистить что-то в конце цикла после каждого элемента ?

+1

Да, вы должны очистить 'command.Parameters' – Alex

ответ

3

Вы должны очистить параметры, находящиеся в собственности command.Parameters, путем вызова метода Clear() перед каждой итерацией.

E.g.

for (int i = 0; i < sortedCells.Count; i++) 
{ 
    command.Parameters.Clear(); 
    //your code to add parameters 
} 

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

1

Сначала определите параметры, затем поместите цикл for и установите значения непосредственно; в настоящее время, если вы читаете код, команда имеет 9 параметров на первой итерации, но 18 на втором, 27 на третьем и так далее.

Изменение его (грубый псевдокод):

//Define parameters here 

for (..) 
{ 
    cmd.Parameters[0].Value = "X"; 
    . 
    . 
} 

Выгоды для делать это таким образом, вы не наращивая параметр объектов каждый раз, создавая и уничтожая объекты часто, когда вы собираетесь повторно их ...

Смежные вопросы