C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ADO-SQL2000, Помогите, горю!!
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 smile.gif
Kuks
Отправлено: 18.10.2005, 08:01


Станционный диспетчер

Группа: Участник
Сообщений: 108



Да я согласен, но как генерировать номера
уже удаленных строк?
Каждый раз прив вставке определять где были пропуски?
Как то не очень элегантно....
AVC
Отправлено: 18.10.2005, 08:27


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

... как генерировать номера уже удаленных строк?

Странноватое требование, но может оправданное smile.gif

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 ------------ присваиваю ключевому полю любое значение!!!!!!


Спасибо еще раз!!!!!!!!!!!!!

Вернуться в Работа с базами данных в C++Builder