簡體   English   中英

SQL Server:存儲過程和ASP.NET

[英]SQL Server : stored procedure and 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個課堂項目。 當它第一次執行循環時,一切都按預期工作,但是在第二次繞過循環后,出現此錯誤:

過程或函數PostScheduledTasks指定的參數過多。

我是否需要在每個項目之后的循環末尾清除一些內容?

您應該在每次迭代之前通過調用Clear()方法來Clear() command.Parameters屬性中保留的參數。

例如

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

每次循環時,都會添加更多參數,而您當前並未清除它們。 因此錯誤是不言自明的:指定了太多參數。

首先定義參數,然后在其后放置for循環並直接設置值; 當前,如果您通讀代碼,該命令在第一次迭代中有9個參數,但是在第二次迭代中有18個參數,在第三次迭代中有27個,依此類推。

將其更改為(粗糙的偽代碼):

//Define parameters here

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

這樣做的好處是您不必每次都建立參數對象,而是在要重用它們時經常創建和銷毀對象...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM