Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 27
1

Создание общих параметров для нескольких команд

04.11.2015, 16:51. Показов 1622. Ответов 7
Метки нет (Все метки)

Программа по некоторому принципу обрабатывает БД. Пусть есть две команды, одна из них добавляет строки в базу, другая обновляет их. Обе команды работают с двумя одинаковыми столбцами базы. Если сначала создать два параметра (как сделано в коде ниже), а потом передать каждой команде эти параметры, то для второй команды получим ошибку о том, что "SqlParameter уже содержится в другом SqlParameterColletion".

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SqlParameter pvar1= new SqlParameter("@var1", SqlDbType.NVarChar, 50);
SqlParameter pvar2= new SqlParameter("@var2", SqlDbType.DateTime);
 
SqlCommand insertCommand = connection.CreateCommand();
insertCommand.Connection = connection;
insertCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM dbo.Table WHERE var1= @var1) INSERT INTO dbo.Table(var1, var2) VALUES(@var1, @var2)";
insertCommand.Parameters.Add(pvar1);
insertCommand.Parameters.Add(pvar2);
 
SqlCommand updateCommand = connection.CreateCommand();
updateCommand.Connection = connection;
updateCommand.CommandText = "UPDATE dbo.Table SET var2= @var2 WHERE var1= @var1";
updateCommand.Parameters.Add(pvar1);
updateCommand.Parameters.Add(pvar2);
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2015, 16:51
Ответы с готовыми решениями:

Создание общих command для menu
Добрый всем день! Как создать общую команду save для всех компонентов menu в проекте?

Обработка выбора для нескольких команд
Как правильно организовать обработку выбора для двух ТЧ ( у каждой есть кнопка подбор) Для...

Конвейер команд для нескольких процессов
Здравствуйте все. Моя задача: написать конвейер команд. Из командной строке поступает команды,...

Создание нескольких кривых одной кнопкой(при изменении параметров)
Здравствуйте. Имеется вот такое чудо: unit Lab6; interface uses Windows, Messages,...

7
Администратор
Эксперт .NET
13782 / 11169 / 4557
Регистрация: 17.03.2014
Сообщений: 22,529
Записей в блоге: 1
04.11.2015, 16:56 2
interpol, создать параметр два раза.
0
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 27
04.11.2015, 16:59  [ТС] 3
А если их будет, например, 10? В таком случае для каждой команды создавать свои параметры уже не очень хочется.
0
Администратор
Эксперт .NET
13782 / 11169 / 4557
Регистрация: 17.03.2014
Сообщений: 22,529
Записей в блоге: 1
04.11.2015, 17:20 4
Лучший ответ Сообщение было отмечено interpol как решение

Решение

interpol, этого в любом случае не избежать т.к. ADO.NET не позволяет использовать один и тот же экземпляр SqlParameter в разных командах. Если параметров будет много, то создать их каждый раз будет неудобно и некрасиво. Тут я с тобой согласен. Упростить код поможет тот факт что SqlParameter реализует ICloneable. Я им не пользовался никогда, но судя по коду он правильно делает свою работу. Для удобства сначала пишем extension метод:
C#
1
2
3
4
5
6
7
static class SqlParameterExtensions
{
    public static SqlParameter GetClone(this SqlParameter prm)
    {
        return (SqlParameter)((ICloneable)p1).Clone();
    }
}
И пользуемся:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SqlParameter pvar1= new SqlParameter("@var1", SqlDbType.NVarChar, 50);
SqlParameter pvar2= new SqlParameter("@var2", SqlDbType.DateTime);
 
SqlCommand insertCommand = connection.CreateCommand();
// Не нужно! - insertCommand.Connection = connection;
insertCommand.CommandText = "IF NOT EXISTS (SELECT 1 FROM dbo.Table WHERE var1= @var1) INSERT INTO dbo.Table(var1, var2) VALUES(@var1, @var2)";
insertCommand.Parameters.Add(pvar1);
insertCommand.Parameters.Add(pvar2);
 
SqlCommand updateCommand = connection.CreateCommand();
// Не нужно! - updateCommand.Connection = connection;
updateCommand.CommandText = "UPDATE dbo.Table SET var2= @var2 WHERE var1= @var1";
updateCommand.Parameters.Add(pvar1.GetClone());
updateCommand.Parameters.Add(pvar2.GetClone());
1
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 27
04.11.2015, 18:33  [ТС] 5
Класс SqlParameterExtensions является тем же классом, где мы все реализуем, или он отдельно создаваемый для клонирования? И откуда в нем берется p1?
0
Администратор
Эксперт .NET
13782 / 11169 / 4557
Регистрация: 17.03.2014
Сообщений: 22,529
Записей в блоге: 1
04.11.2015, 18:35 6
interpol, это отдельный класс. p1 это опечатка. Замени p1 на prm.
0
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 27
04.11.2015, 18:51  [ТС] 7
Как тогда можно указать этот параметр для конкретной команды? Потому что дальше вылетает с ошибкой "запрос UPDATE ожидает параметр var1, который не был указан".
Попытался перед началом обработки определить
C#
1
pvar1.Value = myValue;
, но видимо это затрагивает лишь команду INSERT.

Добавлено через 6 минут
Вроде бы понял.
C#
1
2
insert.Parameters.Value["@var1"] = myValue;
update.Parameters.Value["@var1"] = myValue;
0
Администратор
Эксперт .NET
13782 / 11169 / 4557
Регистрация: 17.03.2014
Сообщений: 22,529
Записей в блоге: 1
04.11.2015, 19:16 8
interpol, раз в обоих случаях используются одинаковое значение, то лучше указать его сразу после его создания SqlParameter:
C#
1
2
3
4
5
6
7
SqlParameter pvar1 = new SqlParameter("@var1", SqlDbType.NVarChar, 50);
pvar1.Value = myValue;
SqlParameter pvar2 = new SqlParameter("@var2", SqlDbType.DateTime);
pvar2.Value = ...;
 
SqlCommand insertCommand = connection.CreateCommand();
// ....
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2015, 19:16

PDO - одно значение для нескольких параметров
Здравствуйте! Запрос содержит несколько параметров, которым присваивается одно и то же значение: ...

Отсутствует значение для одного или нескольких параметров
cmd.CommandText = "INSERT INTO '" + table_name + "'('" + join(field_names, ", ") + "') " + ...

Отсутствует значение для одного или нескольких параметров
Доброго времени суток подскажите в чем ошибка DM.DataModule3.ADOQuery3.Close;...

Отсутствует значение для одного из нескольких требуемых параметров
Me.Controls!.Value = CurrentProject.Connection.Execute("SELECT Заезды.data_zaezda FROM Заезды inner...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.