Kuks |
Отправлено: 17.10.2005, 14:04 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 108
|
Имеется БД на SQL2000 и клиент(ADO). Все нормально работало,
никаких изысков, простое приложение.
Столкнулся с проблемой — поле ID должно быть автоинкрементным,
но пропусков быть не должно, для этого сделал свой счетчик
на UDF и двух триггерах, на SQL2000 все работает отлично, а на клиенте начались проблемы!!!!!!!
При вставке записи в гриде в поле ID появляется 0, хотя на сервере
все нормально, при рефреше появляется ошибка "Дискрептор указы-
вает на строку, помеченную для удаления", при следующем запуске
приложения введенная строка нормально появляется в гриде!!!
Сделал того же клиента (ну совсем простого) в Visual Studio.Net, там работает нормально, а в Билдере не хочет! Обидно!!!!!!!!!!!!!!
Помогите кто может, где посмотреть????
|
|
olegenty |
Отправлено: 17.10.2005, 14:51 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
показывай работу посредством С++ Builder. чем и как доступаешься? (уверен, что раз это работает где-то, то ЛЕГКО должно работать и в BCB. уверен, что воспользовавшись TMemTableEh + TADODataDriverEh, ты смог бы добиться корректной работы.)
|
|
Kuks |
Отправлено: 17.10.2005, 15:20 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 108
|
Доступ стандартный, TADOConnection-TADOQuery;
до момента написания счетчика, все работало отлично,
но сейчас на сервере все работает, и задача выполнена -
счетчик генерирует последовательность идентификаторов
без пропусков, но на клиенте перестало работать, вырабатывает
ошибку или описанную выше или "Источник данных изменил значение
ключевого поля". Я согласен, что в билдере тоже должно работать
но не работает!!!!!
Мозгов не хватает разобраться, но есть всетаки мысль что не корректно
работают триггеры на сервере!
|
|
olegenty |
Отправлено: 17.10.2005, 16:09 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
ну так естественно, при таком раскладе кроме суррогатного кюча должен быть набор полей реального ключа. на него и нужно ориентироваться.
я вообще в такой постановке задачи не понимаю, нафига этот суррогатный ключ нужен, если он будет вести себя, как не ключ.
Отредактировано olegenty — 17/10/2005, 17:09
|
|
Gedeon |
Отправлено: 17.10.2005, 17:25 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Вот один простой тригер, который можно использовать, вроде работает
CODE |
CREATE TRIGGER [my_id] ON [dbo].[tst]
INSTEAD OF INSERT
AS BEGIN
DECLARE @my_id AS INT
SELECT @my_id = ISNULL(MAX(Id),0)+1 FROM tst
INSERT INTO tst (id) VALUES (@my_id)
UPDATE tst
SET tst.tst = i.tst
FROM inserted i
WHERE tst.id = @my_id
END
|
но я бы таки ХП для таких целей использовал.
PS для вставки надо впаривать в запросе инсерта любой номер, его заменит тригер.
Отредактировано Gedeon — 17/10/2005, 17:30
|
|
Kuks |
Отправлено: 18.10.2005, 07:42 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 108
|
2Olegenty, 2Gedeon!
Спасибо за помощь, но хотелось бы сказать, хто решение
Gedeon с ХП проблематичное, потому что мне нужно чтобы номер
вырабатывался БЕЗ ПРОПУСКОВ, т.е. 1,2,3,4,5....., при удалени например
2,3, следующие номера будут не 6,7, а снова 2,3 — юридический момент.
Поэтому я и заморочился с триггерами. Дело в том, что в чистом виде
на сервере, все прекрасно работает, но
[QUOTE]
ну так естественно, при таком раскладе кроме суррогатного кюча должен быть набор полей реального ключа. на него и нужно ориентироваться.
Поэтому попробую поработать еще, если кого интересуют триггеры и UDF, которые использую, покажу где взять...
|
|
olegenty |
Отправлено: 18.10.2005, 07:55 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
я б тоже сделал ХП и зацепил всё на мою любимую связку EhLib
|
|
Kuks |
Отправлено: 18.10.2005, 08:01 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 108
|
Да я согласен, но как генерировать номера
уже удаленных строк?
Каждый раз прив вставке определять где были пропуски?
Как то не очень элегантно....
|
|
AVC |
Отправлено: 18.10.2005, 08:27 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
... как генерировать номера уже удаленных строк?
|
Странноватое требование, но может оправданное
QUOTE |
Каждый раз при вставке определять где были пропуски?
Как то не очень элегантно....
|
Я вижу только так. Другое дело, что можно написать "элегантный" запрос. Сходу вижу несколько вариантов, но каждый надо исследовать на оптимальность. (А результат запроса оформить в SP) |
|
Gedeon |
Отправлено: 18.10.2005, 09:44 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Ну, про заполнение удаленных номеров изначально не было, вот это надеюсь поможет
http://www.osp.ru/win2000/sql/2001/04/865.htm
Ну, а чтобы ошибка не возникала после вставки делайте явно Requery()
|
|
Kuks |
Отправлено: 18.10.2005, 10:37 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 108
|
2 Gedeon->
Именно там я все и взял, попробую Requery();
|
|
Kuks |
Отправлено: 18.10.2005, 11:21 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 108
|
Спасибо огромное, помогло->
AfterPost ----------- Requery();
BeforInsert ------------ присваиваю ключевому полю любое значение!!!!!!
Спасибо еще раз!!!!!!!!!!!!!
|
|