Автоинкрементное поле Access
Модератор: Модераторы
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-запросы.
Снег Север писал(а):Здрасьте, я ваша тётя! Ничего, кроме SQL, вам не дает доступа к записям БД.
Api может позволить несколько больше.
Снег Север писал(а):Это - единственно верное решение. Ограничивать отбор в датасет и делать ему рефреш.
Единственно верное решение это отрефрешить только нужную запись, а не все в буфере.
Снег Север писал(а):Нет никакой разницы, каким способом вы делаете коннект к базе. Дальше уже работает движок базы и ваши SQL-запросы.
Т.е. ADO API и ODBC API неразличимы?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Mikhail, а где уверенность, что база данных за это время не изменилась другой программой?
Лекс Айрин писал(а):Mikhail, а где уверенность, что база данных за это время не изменилась другой программой?
Ну собственно об этом я и сказал - не надежно!
Правда в моем случае доступ монопольный, так что предложенные методы будут работать.
Mikhail писал(а):Речь о том, что этот метод, вообще говоря, не надежен в общем случае.
И Вы можете это доказать? Или как в известной поговорке - языком молоть не кули ворочать?
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 писал(а):Намёк: что будет если в эту таблицу за это время добавят из ещё одного потока?
Для такого есть блокировка таблиц на запись
Cheb писал(а):Руки за такое отрывать.
Намёк: что будет если в эту таблицу за это время добавят из ещё одного потока?
Сам себе оторви руки.
Намёк за что: используется MSACCESS в однопользовательском режиме. А если это будет использоваться в многопользовательском или многопоточном приложении - такому разработчику надо сразу голову отрывать, она ему явно лишняя...
Общего совета по поводу последнего вставленого элемнта нет и никогда не было. Для MSACCESS и MSSQL - то, что написал Снег Север. Для других типов БД - читать документацию.
Снег Север писал(а):Чего???
Того.
Снег Север писал(а):Я не знаю, что такое для вас "буфер", но для большинства движков БД "отрефрешить только нужную запись" - это бессмыслица.
Бессмыслица это загружать большой набор данных из-за одной записи, а если быть точным из-за одного поля одной записи.
Снег Север писал(а):Какое вам, как юзеру БД, до реализации API??? Это системный, а не пользовательский уровень, юзеру на его вообще лезть противопоказано.
Если что-то нельзя сделать через sql, то это, возможно, можно сделать в обход. На уровне компонентов вполне может быть такой доступ.
Mikhail писал(а): в таблице имеется автоинкрементное поле, оно же первичный ключ, как получить его значение сразу после вставки?
Вроде можно было так:
Пусть Query - TSqlQuery с запросом SELECT на все поля таблицы,
Код: Выделить всё
Query.UsePrimaryKeyAsKey := False;
Query.Insert;
Query.FieldByName('Field1').Value := Value1;
...остальные кроме первичного ключа
Query.Post;
Query.ApplyUpdates;
IdValue := Query.FieldByName('IdKey).AsInteger;
Снег Север
По ходу дела пациент цитирует чьи-то чужие мысли не вникая в их смысл...
Mikhail писал(а):Бессмыслица это загружать большой набор данных из-за одной записи, а если быть точным из-за одного поля одной записи.
По ходу дела пациент цитирует чьи-то чужие мысли не вникая в их смысл...
Vadim писал(а):Намёк за что: используется MSACCESS в однопользовательском режиме.
А если значение поля генерируется не последовательно?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Mikhail, это как? Это же ключевое поле, а они всегда генерируются последовательно. Иначе в нем нет смысла.
И надеяться на то, что ты за компом один это непрофессионально. Базы данных общаются с миром только на языке SQL или, но сейчас такие вряд-ли найти, его аналоге. Любой компонент просто скрывает этот обмен от пользователя, да и то не всегда.
Будет смешно, если ид записи можно получить по коду типа ...fiesds[self].AsInteger
И надеяться на то, что ты за компом один это непрофессионально. Базы данных общаются с миром только на языке SQL или, но сейчас такие вряд-ли найти, его аналоге. Любой компонент просто скрывает этот обмен от пользователя, да и то не всегда.
Будет смешно, если ид записи можно получить по коду типа ...fiesds[self].AsInteger
