Автоинкрементное поле Access

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Автоинкрементное поле Access

Сообщение olegy123 » 16.03.2019 07:50:43

Поддержу разговор
Microsoft рекомендует:
https://docs.microsoft.com/ru-ru/dotnet ... ber-values
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Автоинкрементное поле Access

Сообщение Mikhail » 16.03.2019 08:08:20

Vadim писал(а):Вы что, о языке запросов от меня только что узнали?

Причем здесь SQL? Речь о том, что этот метод, вообще говоря, не надежен в общем случае.

Vadim писал(а):У Вас в датасете что, несколько миллионов записей?

Какая разница? Как минимум заново нужно будет установить курсор, в общем не очень хорошее решение.

Добавлено спустя 1 минуту 12 секунд:
olegy123 писал(а):Поддержу разговор
Microsoft рекомендует:
https://docs.microsoft.com/ru-ru/dotnet ... ber-values

Там речь об ADO, а как через ODBC?
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Автоинкрементное поле Access

Сообщение Снег Север » 16.03.2019 08:15:01

Mikhail писал(а):Причем здесь SQL?

Здрасьте, я ваша тётя! Ничего, кроме SQL, вам не дает доступа к записям БД.
Mikhail писал(а):Как минимум заново нужно будет установить курсор, в общем не очень хорошее решение.

Это - единственно верное решение. Ограничивать отбор в датасет и делать ему рефреш.
Mikhail писал(а):Там речь об ADO, а как через ODBC?

Нет никакой разницы, каким способом вы делаете коннект к базе. Дальше уже работает движок базы и ваши SQL-запросы.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2990
Зарегистрирован: 27.11.2007 16:14:47

Re: Автоинкрементное поле Access

Сообщение Mikhail » 16.03.2019 08:34:13

Снег Север писал(а):Здрасьте, я ваша тётя! Ничего, кроме SQL, вам не дает доступа к записям БД.

Api может позволить несколько больше. :)

Снег Север писал(а):Это - единственно верное решение. Ограничивать отбор в датасет и делать ему рефреш.

Единственно верное решение это отрефрешить только нужную запись, а не все в буфере.

Снег Север писал(а):Нет никакой разницы, каким способом вы делаете коннект к базе. Дальше уже работает движок базы и ваши SQL-запросы.

Т.е. ADO API и ODBC API неразличимы? :D
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Автоинкрементное поле Access

Сообщение Лекс Айрин » 16.03.2019 09:00:12

Mikhail, а где уверенность, что база данных за это время не изменилась другой программой?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Автоинкрементное поле Access

Сообщение Mikhail » 16.03.2019 09:13:41

Лекс Айрин писал(а):Mikhail, а где уверенность, что база данных за это время не изменилась другой программой?

Ну собственно об этом я и сказал - не надежно! :)
Правда в моем случае доступ монопольный, так что предложенные методы будут работать.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Автоинкрементное поле Access

Сообщение Vadim » 16.03.2019 10:53:40

Mikhail писал(а):Речь о том, что этот метод, вообще говоря, не надежен в общем случае.

И Вы можете это доказать? Или как в известной поговорке - языком молоть не кули ворочать?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Автоинкрементное поле Access

Сообщение Cheb » 16.03.2019 11:07:49

Vadim писал(а): SELECT MAX(id) FROM tabl;
И после этого id будет известен... ;-)

Руки за такое отрывать.
Намёк: что будет если в эту таблицу за это время добавят из ещё одного потока?
Штатный способ получить айди добавленной строки *должен* быть - но увы, я знаю только, как это устроено в пыхе.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Автоинкрементное поле Access

Сообщение Снег Север » 16.03.2019 11:29:55

Mikhail писал(а):Api может позволить несколько больше.

Чего???
Mikhail писал(а):Единственно верное решение это отрефрешить только нужную запись, а не все в буфере.

Я не знаю, что такое для вас "буфер", но для большинства движков БД "отрефрешить только нужную запись" - это бессмыслица.
Mikhail писал(а):Т.е. ADO API и ODBC API неразличимы?

Какое вам, как юзеру БД, до реализации API??? Это системный, а не пользовательский уровень, юзеру на его вообще лезть противопоказано.

Добавлено спустя 2 минуты 57 секунд:
Cheb писал(а):Намёк: что будет если в эту таблицу за это время добавят из ещё одного потока?

Для такого есть блокировка таблиц на запись
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2990
Зарегистрирован: 27.11.2007 16:14:47

Re: Автоинкрементное поле Access

Сообщение Vadim » 16.03.2019 11:45:27

Cheb писал(а):Руки за такое отрывать.
Намёк: что будет если в эту таблицу за это время добавят из ещё одного потока?

Сам себе оторви руки. :-D
Намёк за что: используется MSACCESS в однопользовательском режиме. А если это будет использоваться в многопользовательском или многопоточном приложении - такому разработчику надо сразу голову отрывать, она ему явно лишняя...
;-)
Общего совета по поводу последнего вставленого элемнта нет и никогда не было. Для MSACCESS и MSSQL - то, что написал Снег Север. Для других типов БД - читать документацию.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Автоинкрементное поле Access

Сообщение Mikhail » 16.03.2019 12:01:55

Снег Север писал(а):Чего???

Того. :D

Снег Север писал(а):Я не знаю, что такое для вас "буфер", но для большинства движков БД "отрефрешить только нужную запись" - это бессмыслица.

Бессмыслица это загружать большой набор данных из-за одной записи, а если быть точным из-за одного поля одной записи.

Снег Север писал(а):Какое вам, как юзеру БД, до реализации API??? Это системный, а не пользовательский уровень, юзеру на его вообще лезть противопоказано.


Если что-то нельзя сделать через sql, то это, возможно, можно сделать в обход. На уровне компонентов вполне может быть такой доступ.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Автоинкрементное поле Access

Сообщение iskander » 16.03.2019 12:07:00

Mikhail писал(а): в таблице имеется автоинкрементное поле, оно же первичный ключ, как получить его значение сразу после вставки?

Вроде можно было так:
Пусть Query - TSqlQuery с запросом SELECT на все поля таблицы,
Код: Выделить всё
  Query.UsePrimaryKeyAsKey := False;
  Query.Insert;
  Query.FieldByName('Field1').Value := Value1;
  ...остальные кроме первичного ключа
  Query.Post;
  Query.ApplyUpdates;
  IdValue := Query.FieldByName('IdKey).AsInteger;
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Автоинкрементное поле Access

Сообщение Vadim » 16.03.2019 12:16:46

Снег Север

Mikhail писал(а):Бессмыслица это загружать большой набор данных из-за одной записи, а если быть точным из-за одного поля одной записи.

По ходу дела пациент цитирует чьи-то чужие мысли не вникая в их смысл... :-D
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Автоинкрементное поле Access

Сообщение Mikhail » 16.03.2019 12:29:05

Vadim писал(а):Намёк за что: используется MSACCESS в однопользовательском режиме.

А если значение поля генерируется не последовательно?
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Автоинкрементное поле Access

Сообщение Лекс Айрин » 16.03.2019 12:50:01

Mikhail, это как? Это же ключевое поле, а они всегда генерируются последовательно. Иначе в нем нет смысла.
И надеяться на то, что ты за компом один это непрофессионально. Базы данных общаются с миром только на языке SQL или, но сейчас такие вряд-ли найти, его аналоге. Любой компонент просто скрывает этот обмен от пользователя, да и то не всегда.
Будет смешно, если ид записи можно получить по коду типа ...fiesds[self].AsInteger
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru