Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление записи в НД 
:(
    Опции темы
NieL
Дата 27.2.2009, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: нет
Всего: 1



Необходимо добавить запись в таблицу БД и установить ее текущей. Пока что cделал что-то типа:


Код

 Q.SQL.Text := Format('Insert into Orders (link_id) values (%d)', [link_id]);
 Q.ExecSQL;
 Q.Last;



Но тут возник вопрос, если с базой буде работать одновременно несколько десятков пользователей, какова вероятность нарваться не на "свою" записть (Q.Last).
Или же лучше делать добавление через через TTable. 

Код

try
 Table.Append;
 Table.FieldByName('link_id').AsInteger := link_id;
 Table.Post;
except
 Table.Cancel;
end;

PM MAIL   Вверх
Kbl4AH
Дата 27.2.2009, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



2-й вариант имхо лучше... во-первых, не на свою не нарвешься, во-вторых, доп. запрос не требуется.
PM MAIL ICQ   Вверх
pseud
Дата 27.2.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



оба варианта плохи:
1. Зачем Last если нам известен (я так понимаю уникальный) id? Почему тогда не Locate?
2. С детства аллергия на TTable.

Добавлено через 1 минуту и 30 секунд

--------
да и 
Код

 Q.SQL.Text := Format('Insert into Orders (link_id) values (%d)', [link_id]);
 Q.ExecSQL;
 Q.Last;

Last можно сделать в выборке. а выборки в Q нет.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Deniz
Дата 27.2.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



NieL, а как насчет правил написания сообщения?
Код
Обязательно указание:
1. Базы данных (Paradox, Oracle и т.п.)
2. Способа доступа (ADO, BDE и т.д.)


Kbl4AH, про TTable лучше вообще забыть.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
NieL
Дата 27.2.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: нет
Всего: 1



Цитата

1. Зачем Last если нам известен (я так понимаю уникальный) id? Почему тогда не Locate?


link_id - не является уникальным id, он принимает значения в диапазоне 1..3, а Уникальный id (Item_id) генерится автоматически при добавлении.

C 
Код
Q.Last
 я ошибся - у меня здесь Table.Last;

Цитата

NieL, а как насчет правил написания сообщения?


1. DBISAM
2. свой набор компонент постовляемый с базой (в принципе аналог BDE)
PM MAIL   Вверх
pseud
Дата 27.2.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(NieL @  27.2.2009,  12:51 Найти цитируемый пост)

1. DBISAM
2. свой набор компонент постовляемый с базой (в принципе аналог BDE)

раз как БДЕ, то вот БДЕ пример.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  iLinkID: Integer;
  iID: Integer;
begin
  iLinkID := 777;

  with TQuery.Create(Database1) do
  try
    SQL.Text := Format('INSERT INTO orders (link_id) VALUES (%d)', [iLinkID]);
    ExecSQL;
    SQL.Text := 'SELECT MAX(item_id) AS new_id FROM orders';
    Active := True;
    iID := FieldByName('new_id').AsInteger;
  finally
    Free;
  end;

  Query1.Active := False;
  Query1.Active := True;
  Query1.Locate('item_id', VarArrayOf([iID]), []);
end;

Query1 - твоя выборка для грида (наверно). например такая:
Код

SELECT * FROM orders



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Deniz
Дата 27.2.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(NieL @  27.2.2009,  15:51 Найти цитируемый пост)
1. DBISAM
а там есть возможность получить id только что вставленной тобой записи?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
NieL
Дата 27.2.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: нет
Всего: 1



Код

SQL.Text := 'SELECT MAX(item_id) AS new_id FROM orders';

Но ведь в этом случае есть шанс нарваться не на "свою" запись? 
PM MAIL   Вверх
pseud
Дата 27.2.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(NieL @  27.2.2009,  13:31 Найти цитируемый пост)
Но ведь в этом случае есть шанс нарваться не на "свою" запись? 


 шанс мизерный



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Kbl4AH
Дата 27.2.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



pseud, Deniz... причем здест Тейбл? Главное есть Датасет.... а если есть Датасет, то после 
Код

 Датасет.Append;
 Датасет.FieldByName('link_id').AsInteger := link_id;
 Датасет.Post;

будет активна именно добавленная запись... или я чего-то не понимаю smile 
PM MAIL ICQ   Вверх
NieL
Дата 27.2.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: нет
Всего: 1



Кажется нашел способ:

Код

insert into orders (link_id) values (%d); select @@identity


Но возможно в нем есть недостатки?
PM MAIL   Вверх
pseud
Дата 27.2.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Kbl4AH, возможно с логикой использования TTable все нормально.
Но я не хочу его обсуждать впринципе.
Потому как:
Цитата(pseud @  27.2.2009,  12:29 Найти цитируемый пост)
2. С детства аллергия на TTable.


Добавлено через 1 минуту и 45 секунд
Цитата(NieL @  27.2.2009,  13:43 Найти цитируемый пост)
Кажется нашел способ:

вопрос сугубо к спецам DBISAM.
но что-то мне подсказывает, что select @@identity вернет следующее значение счетчика.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Kbl4AH
Дата 27.2.2009, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Цитата(pseud @  27.2.2009,  14:37 Найти цитируемый пост)
Kbl4AH, возможно с логикой использования TTable все нормально.

Я его сам никогда не использовал...
Я про случай DBGrid-TDataSource-TDataSet
PM MAIL ICQ   Вверх
pseud
Дата 27.2.2009, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Kbl4AH @  27.2.2009,  14:38 Найти цитируемый пост)
Я его сам никогда не использовал...
Я про случай DBGrid-TDataSource-TDataSet

чтоб сработал 
Код

DataSet.Insert

DataSet должен быть с двунапарвленным курсором (тот самый TTable)
именно этого я и не люблю.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
NieL
Дата 27.2.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 10.2.2008

Репутация: нет
Всего: 1



"Значение полю со свойством IDENTITY присваивается автоматически в момент создания новой записи. Новое значение - это последнее использованное значение плюс некоторая фиксированная величина. Обратите внимание, новое значение опирается не на максимальное значение в существующих записях, а на последнее использованное значение. Это значит, что записи с последним использованным значением физически может не существовать, тем не менее, это значение будет использовано.".
 
В моем случае  при каждом добавлении будет возвращено значение соответствующее значению уникальной записи, или я не прав?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0674 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.