Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

Вернуться   Форум программистов > .NET > Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 12.11.2017, 14:23   #1
Grinvel
Пользователь
 
Регистрация: 25.09.2017
Сообщений: 16
Репутация: 10
По умолчанию Запрос UPDATE - принцип работы

БД Access. Добавляемые в БД записи должны вставать на места согласно алфавиту. Для этого при вставке прогоняю алгоритм сортировки, чтобы узнать позицию вставляемой детали. После этого нужно перезаписать индексы последующих записей.

Код:

int tempID = SortBD(frAddChange.TextInRegNumDetailBox);                     //индекс вставляемой записи
            CommandText = "UPDATE Table1 Set [№] = [№] + 1 Where [№] >= @idAddDetail";  //перезапись индексов записей, стоящих после удалённой
            bdParam.Add("@idAddDetail", Convert.ToString(tempID));

В этом случае возникает ошибка повторяющихся значений в ключевом поле. Тип ключевого поля [№] числовой.

В связи с этим вопрос: запрос Update работает с первой удовлетворяющей условиям записи и до последней? Если так, то возможна ли организация этого запроса в обратном порядке, т.е. с последней записи и до первой? Если нет, то какие есть альтернативы? Тот же принцип у меня используется при удалении детали, но в том случае индексы не повторяются.
Grinvel вне форума   Ответить с цитированием
Старый 12.11.2017, 15:41   #2
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,767
Репутация: 2114
По умолчанию

оставлять в БД записи НЕУПОРЯДОЧЕНЫМИ.
а при выборе (операторе select) использовать order by и recno
__________________
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума   Ответить с цитированием
Старый 12.11.2017, 18:23   #3
Grinvel
Пользователь
 
Регистрация: 25.09.2017
Сообщений: 16
Репутация: 10
По умолчанию

Я бы так и сделал, но проблема в том, что это больше нужно не во время работы программы, а после. Другими словами, чтобы при открытии access записи были упорядочены, т.к. эта база является стандартным перечнем, который время от времени правится. Поэтому для удобства поиска и нужна сортировка по алфавиту
Grinvel вне форума   Ответить с цитированием
Старый 12.11.2017, 19:38   #4
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,106
Репутация: 6385
По умолчанию

Это не правильный подход. На то он и order by. Но если очень хочется, то два update
Код:

UPDATE Table1 Set [№] = [№] + @a Where [№] >= @idAddDetail
UPDATE Table1 Set [№] = [№]- @a + 1 Where [№] >= @idAddDetail

где в @a число заведомо большее количества обновляемых записей
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар на форуме   Ответить с цитированием
Старый 12.11.2017, 20:15   #5
Grinvel
Пользователь
 
Регистрация: 25.09.2017
Сообщений: 16
Репутация: 10
По умолчанию

не самое элегантное решение, но подойдёт, спасибо всем за помощь
Grinvel вне форума   Ответить с цитированием
Старый 12.11.2017, 20:24   #6
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,106
Репутация: 6385
По умолчанию

Ну какое может быть элегантное решение для не элегантного подхода к базе ))
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар на форуме   Ответить с цитированием
Старый 12.11.2017, 20:37   #7
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,767
Репутация: 2114
По умолчанию

Код:

update t set N = N+1 where text>'новый текст'

insert into t (N,text) 
select count(*), 'новый текст' from t where text <'новый текст'

__________________
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Принцип работы 3D принтера oldsnowman Микроконтроллеры, робототехника, схемотехника, 3D принтеры 9 04.05.2017 01:09
Объясните принцип работы danada1 Помощь студентам 1 27.03.2013 15:20
принцип работы SaveDialog Form_13 Общие вопросы Delphi 1 20.02.2012 00:24
принцип работы ссылки sbcd Свободное общение 0 03.06.2011 21:50
Принцип работы NS-серверов Ivan_32 Свободное общение 1 31.10.2010 04:38


08:26.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru