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

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

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

olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Поддержу разговор
Microsoft рекомендует:
https://docs.microsoft.com/ru-ru/dotnet ... ber-values
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

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

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

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

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

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

Там речь об ADO, а как через ODBC?
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

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

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

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

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

Сообщение Mikhail »

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

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

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

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

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

Т.е. ADO API и ODBC API неразличимы? :D
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Mikhail, а где уверенность, что база данных за это время не изменилась другой программой?
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

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

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

Сообщение Vadim »

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

И Вы можете это доказать? Или как в известной поговорке - языком молоть не кули ворочать?
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Сообщение Cheb »

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

Руки за такое отрывать.
Намёк: что будет если в эту таблицу за это время добавят из ещё одного потока?
Штатный способ получить айди добавленной строки *должен* быть - но увы, я знаю только, как это устроено в пыхе.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

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

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

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

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

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

Для такого есть блокировка таблиц на запись
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

Сам себе оторви руки. :-D
Намёк за что: используется MSACCESS в однопользовательском режиме. А если это будет использоваться в многопользовательском или многопоточном приложении - такому разработчику надо сразу голову отрывать, она ему явно лишняя...
;-)
Общего совета по поводу последнего вставленого элемнта нет и никогда не было. Для MSACCESS и MSSQL - то, что написал Снег Север. Для других типов БД - читать документацию.
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

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

Того. :D

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

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

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


Если что-то нельзя сделать через sql, то это, возможно, можно сделать в обход. На уровне компонентов вполне может быть такой доступ.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

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

Вроде можно было так:
Пусть Query - TSqlQuery с запросом SELECT на все поля таблицы,

Код: Выделить всё

  Query.UsePrimaryKeyAsKey := False;
  Query.Insert;
  Query.FieldByName('Field1').Value := Value1;
  ...остальные кроме первичного ключа
  Query.Post;
  Query.ApplyUpdates;
  IdValue := Query.FieldByName('IdKey).AsInteger;
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Снег Север

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

По ходу дела пациент цитирует чьи-то чужие мысли не вникая в их смысл... :-D
Mikhail
энтузиаст
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Сообщение Mikhail »

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

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

Сообщение Лекс Айрин »

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