Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
4 / 4 / 5
Регистрация: 01.03.2013
Сообщений: 180

InsertCommand с использованием TableAdapter и полей по умолчанию

15.09.2019, 11:02. Показов 1613. Ответов 8

Студворк — интернет-сервис помощи студентам
Всем привет!
Создаю адаптеры таблиц TableAdapter. В таблице в базе MSSQL для полей DatCreate и UserCreator указаны значения по умолчанию (getdate() и suser_sname() соответственно).
Далее на форму добавляю грид (devexpress GridControl) и указываю ему одну из таблиц.
Теперь при создании на форме в этой таблице новой строки и вызова метода Adapter.Update(myTable), конечно же, вылазит ошибка, что значение не может быть null для полей DatCreate и UserCreator.
Как вы решаете данную проблему?

Я вижу несколько путей решения или попыток:
1) В созданном адаптере в команде InsertCommand удалить эти поля. Но тогда при повторной генерации кода адаптера эти поля вернуться. К тому же, поля указаны как AllowDBNull=false, поэтому плюсом происходит проверка в DataColumn.CheckNullable.
1.1) Тогда можно этим колонкам поставить AllowDBNull=true, а в InsertCommand также удалить их. Тогда все без ошибок отработает, но, как уже указал выше, при повторной генерации кода все вернется как было.

2) Добавить в адаптер метод на вставку, в котором укажу все поля за исключением DatCreate и UserCreator.
а) Но тогда придется как то подменять стандартную InsertCommand на новую и вызывать Update (хотя в этом случае опять будет проблема проверки DataColumn.CheckNullable).
б) Либо вызывать этот метод заместо Adapter.Update, когда происходит вставка в таблицу, но я даже не знаю, как это сделать. Наверное делать GetChanges у таблицы и брать те строки, которые вставляются, пройтись foreach по ним и вызвать мой метод Insert. А как тогда в этом случае указать, что не нужно вызывать InsertCommand у адаптера, но следует вызвать другие (update и delete)? И потом придется вызывать еще метод Fill. Плюсом ко всему, опять возникает проблема проверки DataColumn.CheckNullable.

3) Для одной и той же таблицы создать два адаптера: в одном будут все поля кроме полей по умолчанию, а в другом первичный ключ и поля по умолчанию. Создать между ними связь по первичному ключу, в первом адаптере создать поля, которых не хватает, и в свойстве Expression указать Parent.DatCreate и Parent.UserCreator. Но в таком методе возникает проблема скорости обращения к таблице, потому что придется два раза делать Select к таблице, а что если данных много?

Все перечисленные мной методы имеют место быть, но не являются быстрыми и удобными (в таком случае я вообще мог бы вручную создавать адаптеры и прописывать команды вставки, обновления и удаления, а также кэпшены и другие свойства колонок).
Может кто сталкивался с такой проблемой и решал как-нибудь?
Ладно бы таких таблиц было мало (а лучше всего одна), но их много, и будут появляться еще, и не очень хотелось бы делать большие манипуляции с настройкой каждого адаптера. Лучше использовать время для разработки основных бизнес-процессов программы.

Надеюсь, вы мне поможете и направите мысли в нужное русло. Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.09.2019, 11:02
Ответы с готовыми решениями:

заполнение полей по умолчанию
Как в полях типа Reader и Authors сделать так, чтобы при создании нового документа сразу эти поля заполнялись по умолчанию Администратором...

Пользователь по умолчанию+заполнение полей
Не могу понять: есть кнопка, по нажати. на которую открывается окно, в нем выберается пользователь и в соответствии с выбранны ФИО...

Наследование и значения полей по умолчанию
После объявления класса Base создать такой класс Derived, унаследованный от Base, чтобы его field1 по умолчанию имело значение...

8
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
15.09.2019, 13:22
Цитата Сообщение от Sanches Посмотреть сообщение
значения по умолчанию
Если в переданных данных значения нет, то СУБД будет заменять null на определенное вами значение. А вы в БД поставили, что поле not null, сделав невозможным применение значения по умолчанию.
0
4 / 4 / 5
Регистрация: 01.03.2013
Сообщений: 180
16.09.2019, 06:47  [ТС]
Цитата Сообщение от Igr_ok Посмотреть сообщение
сделав невозможным применение значения по умолчанию.
я использую субд mssql 2008. Может в какой другой версии или другой субд и невозможно, но в моем случае значения по умолчанию применяются: если поле имеет значение по умолчанию и в insert'е не указано, то неважно, является поле null or not null, вставится значение по умолчанию. Но адаптер то создает для всех полей параметры в InsertCommand. Вот и получается, что происходит попытка вставки null в мои поля. И если поле разрешает null, то null и вставится (чего мне не нужно). Если не разрешает, то вызовется исключение.
0
.NET
133 / 91 / 44
Регистрация: 17.08.2015
Сообщений: 296
16.09.2019, 07:57
Цитата Сообщение от Sanches Посмотреть сообщение
направите мысли в нужное русло.
Если используется MSSQL то можно сделать хранимую процедуру которая будет вставлять GETDATE()

Добавлено через 2 минуты
так же можно добавить пару текстбоксов для вставки значения по кнопке. Тогда с GETDATE() проблем не будет
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
16.09.2019, 08:39
Sanches, вы правы, то был плохой совет.
В select запросе адаптера не указывайте поля по умолчанию и тогда они будут созданы корректно.
0
4 / 4 / 5
Регистрация: 01.03.2013
Сообщений: 180
16.09.2019, 08:57  [ТС]
Цитата Сообщение от M1ke423 Посмотреть сообщение
Если используется MSSQL то можно сделать хранимую процедуру которая будет вставлять GETDATE()
Наверное, вы имели ввиду триггер на вставку данных. Этот вариант хорош, но не хочется для каждой таблицы еще писать триггер, когда есть такой замечательный способ, как Поля по умолчанию. Триггер постоянно нужно держать в голове. А потом еще и могут возникнуть проблемы, если вдруг захочется еще понаделать триггеров различных типов (есть у меня такое с одной таблицей, где как раз таки триггер на вставку значений по умолчанию очень мешал: заменил его полями по умолчанию)

Цитата Сообщение от M1ke423 Посмотреть сообщение
так же можно добавить пару текстбоксов для вставки значения по кнопке. Тогда с GETDATE() проблем не будет
Хм, не представляю, как это будет работать (и как выглядеть).

Цитата Сообщение от Igr_ok Посмотреть сообщение
В select запросе адаптера не указывайте поля по умолчанию и тогда они будут созданы корректно.
Тогда они не будут отображены в таблице в программе, а они нужны, но только для отображения. Пользователь только заполняет остальные поля и нажимает сохранить.
Я очень надеялся, что данные поля уйдут из InsertCommand (да и UpdateCommand тоже), если бы я поставил данные поля ReadOnly=true у DataColumn. Но, увы...
0
.NET
133 / 91 / 44
Регистрация: 17.08.2015
Сообщений: 296
16.09.2019, 09:00
Цитата Сообщение от Sanches Посмотреть сообщение
триггер
нет, я имел в виду именно хранимую процедуру которую у себя вызываю вот так
C#
1
2
3
4
5
6
7
                orderAdapter.InsertCommand = new SqlCommand("sp_Orders", sqlconnection);
                orderAdapter.InsertCommand.CommandType = CommandType.StoredProcedure;
                orderAdapter.InsertCommand.Parameters.Add(new SqlParameter("@Username", SqlDbType.NVarChar, 50, "Username"));
                orderAdapter.InsertCommand.Parameters.Add(new SqlParameter("@Money", SqlDbType.Int, 0, "Money"));
                orderAdapter.InsertCommand.Parameters.Add(new SqlParameter("@Date", SqlDbType.DateTime, 50, "Date"));
                SqlParameter parameter = orderAdapter.InsertCommand.Parameters.Add("@Idorders", SqlDbType.Int, 0, "Idorders");
                parameter.Direction = ParameterDirection.Output;
Как пример, код моей процедуры
T-SQL
1
2
3
4
5
6
7
8
9
10
CREATE PROCEDURE [dbo].[sp_Orders]
    @username nvarchar(MAX),
    @money nvarchar(MAX),
    @date datetime,
    @Idorders int out
AS
    INSERT INTO Orders(Username, Money, Date)
    VALUES (@username, @money, GETDATE())
   
    SET @Idorders=SCOPE_IDENTITY()
У меня была точно такая же проблема, много чего перепробовал
1
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
16.09.2019, 10:33
Sanches, https://social.msdn.microsoft.... netdataset
В качестве решения предлагается редактирование InsertCommand, использование триггера и др.
Я бы сначала создал адаптер с запросом без полей по умолчанию, а после создания INSERT,UPDATE команд заменил в SELECT запрос на полный.
1
4 / 4 / 5
Регистрация: 01.03.2013
Сообщений: 180
16.09.2019, 11:08  [ТС]
Цитата Сообщение от M1ke423 Посмотреть сообщение
нет, я имел в виду именно хранимую процедуру
Спасибо за способ. Но если все команды прописывать руками, то и проблема как таковая исчезает. У меня же задача сохранить проектирование структуры БД в программе с помощью мышки (собственно создание TableAdapter со всеми командами и типизированными свойствами). А так, конечно, можно и процедуру на вставку сделать, а можно и просто запрос такой впихнуть в InsertCommand, особой разницы нет. Но все эти способы плохи тем, что нужно проектировать команды запроса самостоятельно. А таблиц таких много, и их конечная структура еще далека (из-за этого придется обновлять TableAdapter).
Цитата Сообщение от Igr_ok Посмотреть сообщение
после создания INSERT,UPDATE команд заменил в SELECT запрос на полный
неплохой способ, только тогда не будут созданы свойства у MyTableRow, возвращающие значения недостающих полей. И опять для каждого адаптера нужно писать дублирующий запрос, но с данными полями.
Может есть возможность без помощи парсера добавить (или удалить) поля из SELECT'а? Чтобы не переписывать весь запрос.
Есть идея, как реализовать способ, который я описал в первом посте под цифрой 2. Если получится, то выложу сюда.
Хочется, чтобы использование адаптера было такое: создал его как обычно, указал где нибудь, какие поля являются полями по умолчанию, и все. Далее при вызове Update (уже другой, собственный метод Update у TableAdapter) уже пойдет анализ InsertCommand'ы и полей, которые указаны как поля по умолчанию, чтобы из команды они были исключены. А потом, когда insertCommand у адаптера будет заменен, будет вызван метод Update у TableAdapter.Adapter.
Еще оформить это как расширение, чтобы потом можно было использовать везде.
Как вам идейка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.09.2019, 11:08
Помогаю со студенческими работами здесь

Значение полей по умолчанию : "нет значения поля по умолчанию"; "Null";"0"
Форумчане, доброго времени суток! Подскажите. пожалуйста, как правильно указывать значение поля по умолчанию в таблице Аксесс 2003?? ...

Определить конструктор для инициализации полей по умолчанию
У меня такое задание по лабу, кстати она самая сложная и последняя: дана структура: struct Student { char *LastName; ...

Инициализация полей структуры в конструкторе по-умолчанию класса
Всем привет! #include <string> #include <vector> #pragma once class StudentsList { public:

Задание значений по умолчанию для полей и элементов управления
Access 2007 1. Есть таблица, поля в которой заполняются через списки, привязанные к другой таблице. Необходимо выставить в ней значения...

Как убрать затенение полей кодов из текста, при выделении ( стоит в ворде по умолчанию)
Как убрать затенение полей кодов из текста, при выделении ( стоит в ворде по умолчанию), но не так чтобы видно не было только у меня на...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru