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

 
Как узнать значение ключа ?, у только-что введенной записи
Dima
  Отправлено: 21.08.2003, 14:42


Дежурный стрелочник

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



Как узнать значение ключа у только-что введенной записи?
Записи (типа лога) вводятся в таблицу с первичным ключом причем записи достаточно однотипные, в другую таблицу вводится расшифровка этих записей с внешним ключом.
iAlexander
Отправлено: 21.08.2003, 17:00


Дежурный стрелочник

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



А запись вводится средствами Билдера типа

Table->Append()
...
Table->Post()
?

ну тогда после добавления взять да сделать
AnsiString KeyValue = Table->FieldByName("YourKey")->AsString;
Но: либо это поле должно быть в списке полей Table, либо таковой спислк должен быть пуст вообще.
Гость_Dima
  Отправлено: 21.08.2003, 19:44


Не зарегистрирован







QUOTE (Dima @ 21/08/2003, 15:44)
Как узнать значение ключа у только-что введенной записи?
Записи (типа лога) вводятся в таблицу с первичным ключом причем записи достаточно однотипные, в другую таблицу вводится расшифровка этих записей с внешним ключом.

BD MS SQL Server
Записи вводятся с помощью Insert
iAlexander
  Отправлено: 22.08.2003, 14:20


Дежурный стрелочник

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



В данном случае разницы нет. Post(), кажется, не перемещает указатель активной записи, а Insert() как раз и позиционирует его на вставляемую, так что после Post'a делай
AnsiString KeyValue = Table->FieldByName("YourKey")->AsString;
или ->AsInteger;
Dima
  Отправлено: 25.08.2003, 08:26


Дежурный стрелочник

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



Я наверно не совсем правильно выразился.
Все вставки происходят через Query. Загружать таблицу в память по мойму не очень эффективно. Это всеволишь лог! да и таблицы большие.
На данный момент у меня только одно решение. Я после Insert-а делаю Selct на выборку максимального индекса из таблицы. Вставить Select непосредственно в Insert не получается, т.к. запросы динамические (Insert Into tbl (nn,mm) Value(?,?))

Есть ли другие решения ?
LeeMouse
Отправлено: 04.09.2003, 11:27


Дежурный стрелочник

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



Это НЕ решение... Полный инкоррект при совместном доступе. Используй хранимую процедуру для вставки, которая будет возвращать тебе ключ вставленной записи.
Подсказка: на стороне серверна есть волшебная функция SCOPE_IDENTITY(), которая корректно отдаёт поле со свойством identity для только что вставленной записи.
Monster
Отправлено: 15.09.2003, 10:32


Ученик-кочегар

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



Если ключевое поле у тебя — Identity, то LeeMouse прав: лучшее, это SCOPE_IDENTITY(). Если нет, то единственный способ — открыть транзакцию, заблокировать всю таблицу, добавить запись, считать максимальный индекс, закрыть транзакцию(блокировка снимется автоматически).
Это надежный способ, но осложнения от него, ты надеюсь представляешь...
Dima
Отправлено: 19.09.2003, 08:51


Дежурный стрелочник

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



Большое спасио LeeMouse. Всё работает.

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