Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление записи в НД 
:(
    Опции темы
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   Вверх
Kbl4AH
Дата 27.2.2009, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(pseud @  27.2.2009,  14:57 Найти цитируемый пост)
DataSet должен быть с двунапарвленным курсором

а разве бывают DataSet с однонаправленным курсором? какие?
PM MAIL ICQ   Вверх
pseud
Дата 27.2.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(NieL @  27.2.2009,  15:03 Найти цитируемый пост)
В моем случае  при каждом добавлении будет возвращено значение соответствующее значению уникальной записи, или я не прав?

повторяю: вопрос сугубо к спецам DBISAM.

а теперь вопрос к тебе - транзакции поддерживаются? процедуры?

Добавлено @ 15:21
Цитата(Kbl4AH @  27.2.2009,  15:13 Найти цитируемый пост)
а разве бывают DataSet с однонаправленным курсором? какие?


давай отойдем от понятий "одно/двунаправленные". чтоб нас не обвинили в делитантстве.

чем плох TTable - он открывает полный доступ первому открывшему таблицу и закрывает всем остальным.
о многопользовательском режиме сразу можно забыть.

Добавлено @ 15:23
Цитата

TTable provides direct access to every record and field in an underlying database table, whether it is from Paradox, dBASE, Access, FoxPro, an ODBC-compliant database, or an SQL database on a remote server, such as InterBase, Oracle, Sybase, MS-SQL Server, Informix, or DB2.


Добавлено @ 15:24
да к тому же выгребает абсолютно все записи на клиента.



блин несу получепуху от недостатка времени. обещал себе не трогать его и не буду.

Это сообщение отредактировал(а) pseud - 27.2.2009, 15:27


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


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



А нет ли у этой СУБД поддержки returning?
Код

insert into table (a, b) values(10, 20) returning id

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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