Как выполнить хранимую процедуру несколько раз в C # - PullRequest
6 голосов
/ 13 сентября 2011

У меня есть приложение с расписанием, в котором пользователи вводят / выводят свое время для разных дней недели.Форма обрабатывает вход / выход из каждого дня, заполняет их как параметры в хранимой процедуре и добавляет их в базу данных.Как бы я достиг этого наиболее эффективно?У меня нет доступа к БД, только хранимые процедуры.

Это пустой код, я удалил некоторые ненужные коды.

SqlConnection conn = new SqlConnection(connString);
conn.Open();
SqlCommand cmd = new SqlCommand("insertINOUT", conn);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add(new SqlParameter("@UserName", user));

for (int j = 0; j < weekDays.Length; j++)
{
    cmd.Parameters.Add(new SqlParameter("@In", in));
    cmd.Parameters.Add(new SqlParameter("@Out", out));
    cmd.ExecuteReader();
}
conn.Close();

Код работает, еслиесть только 1 день входа / выхода.Если пользователи заполнят несколько дней, я получу эту ошибку: параметр '@In' был указан несколько раз.

Спасибо за вашу помощь.

Ответы [ 5 ]

17 голосов
/ 13 сентября 2011
SqlConnection conn = new SqlConnection(connString);
conn.Open();
SqlCommand cmd = new SqlCommand("insertINOUT", conn);
cmd.CommandType = CommandType.StoredProcedure;

for (int j = 0; j < weekDays.Length; j++)
{
    **cmd.Parameters.Clear();**
    cmd.Parameters.Add(new SqlParameter("@UserName", user));
    cmd.Parameters.Add(new SqlParameter("@In", in));
    cmd.Parameters.Add(new SqlParameter("@Out", out));
    cmd.ExecuteReader();
}
conn.Close();

(Необходимо очищать параметры на каждой итерации.)

1 голос
/ 13 сентября 2011
using (SqlConnection conn ... )
{
    SqlCommand cmd = ...
    ...
    // Set up the parameter list.
    //   You can use   .AddWithValue   here to add values that don't change in the loop.
    cmd.Parameters.Add("@Username", SqlDbType.VarChar);
    ...
    for (...)
    {
        // Load one set of loopy values.
        cmd.Parameters["@UserId"].Value = user;
        ...
    }
}
1 голос
/ 13 сентября 2011

Другой вариант, вы можете изменить область действия SqlCommand, чтобы она каждый раз создавалась заново.

SqlConnection conn = new SqlConnection(connString);
conn.Open();

for (int j = 0; j < weekDays.Length; j++)
{
    SqlCommand cmd = new SqlCommand("insertINOUT", conn);
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add(new SqlParameter("@UserName", user));
    cmd.Parameters.Add(new SqlParameter("@In", in));
    cmd.Parameters.Add(new SqlParameter("@Out", out));
    cmd.ExecuteReader();
}
conn.Close();

Кажется немного расточительным, но есть некоторые библиотеки, которые работают таким образом (Enterprise Library DAABприходит в голову).

0 голосов
/ 17 августа 2017
SqlConnection conn = new SqlConnection(connString);
conn.Open();
SqlCommand cmd = new SqlCommand("insertINOUT", conn);

    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add(new SqlParameter("@UserName", user));
    for (int j = 0; j < weekDays.Length; j++)
    {


        cmd.Parameters.Add(new SqlParameter("@In"+j, in));
        cmd.Parameters.Add(new SqlParameter("@Out"+j, out));
        cmd.ExecuteReader();
    }
    conn.Close();
0 голосов
/ 13 сентября 2011

Причина, по которой вы получаете эту ошибку, заключается в том, что цикл for повторно добавляет параметр несколько раз:

cmd.Parameters.Add(new SqlParameter("@In", in));
cmd.Parameters.Add(new SqlParameter("@Out", out));

Правильный способ сделать это - очистить коллекцию параметров в последней строкецикл foor или просто проверьте, существует ли параметр и установите его значение вместо Parameters.Add

...