powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Builder+ADO+Postgres
12 сообщений из 12, страница 1 из 1
Builder+ADO+Postgres
    #33211829
Denissio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бьюсь над дурацкой проблемой:

Есть таблица в постгресе: 1-е поле id - автоинкремент, 2-е поле name - text
В билдере используется ADOTable.
Создаю новую запись, в которой соответственно заполняю name, а id ожидается
что будет сам формироваться.
В датасете таким образом появляется новая запись. Далее пытаюсь изменить в
этой же записи name и получаю ошибку: "Не удается найти строку для
обновления. Некоторые значения могли быть изменены со времени ее последнего
чтения". В этот момент лезу в базу админкой и смотрю что там записалось. Там
все нормально, включая id. Делаю вывод, что глюк где-то в датасете. Прочесал
весь хелп вдоль и поперек - ничего не помогает. Там пишут, что после вызова
метода Post(), датасет загружает обновленную информацию снова из базы, таким
образом предполагаю, что это автоинкрементальное значение должно появиться в
датасете, но нет его там! Как вообще датасет идентифицирует записи? Как
работать с автоинкрементами?
Получается, что на данный момент нет возможности добавлять записи без
закрытия и затем открытия датасета. Но это же маразм.

Если кто разобрался с этим - подкинте инфу, а лучше примеры.
Заранее спасибо!!!


Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Builder+ADO+Postgres
    #33211837
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это -- классический дебилизм Дельфы (его TTable). Не умеет он понимать, что какие-то поля нельзя задавать при вставке, но значения их генерируются при этом. Это встречается на многих СУБД - Sybase, MSSQLServer. Рекомендую плюнуть на TTable и работать запросами. Преимуществ гораздо больше - все делаешь сам, все контролируешь.
...
Рейтинг: 0 / 0
Builder+ADO+Postgres
    #33212336
Denissio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭто -- классический дебилизм Дельфы (его TTable). Не умеет он понимать, что какие-то поля нельзя задавать при вставке, но значения их генерируются при этом. Это встречается на многих СУБД - Sybase, MSSQLServer. Рекомендую плюнуть на TTable и работать запросами. Преимуществ гораздо больше - все делаешь сам, все контролируешь.
Не очень понятно какая тогда должна быть структура. Т.е. не использовать датасеты вообще? Или как? Если можно ссылку на какой-нибудь пример. А то пока нигде не попадалась действующая схема.
...
Рейтинг: 0 / 0
Builder+ADO+Postgres
    #33212908
Denissio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, я еще нашел, что можно создать в датасете постоянные поля
(persistent fields) и прописать ему свойство AutoIncrement. В инструкции
есть целый раздел посвященный этому, но это тоже не помогло. Предполагаю,
что опять сам что-то не так сделал.

Есть идеи по этому поводу?


Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Builder+ADO+Postgres
    #33213872
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DenissioНе очень понятно какая тогда должна быть структура. Т.е. не использовать датасеты вообще? Или как? Если можно ссылку на какой-нибудь пример. А то пока нигде не попадалась действующая схема.
Да, не использовать датасеты вообще. Посылаешь запрос через ADO, получаешь ADO-resultset и функциями самого ADO работаешь с каждой ячейкой резалт-сета. Надо - раскидываешь данные из ADO-resultset вручную по ячейкам экранной таблицы, надо обновить - вручную же читаешь данные из ячеек экранной таблицы и формируешь INSERT/UPDATE запросы которые и кидаешь в базу.
Теоретически VCL это все уже само делать умеет, но к сожалению не достаточно хорошо....
...
Рейтинг: 0 / 0
Builder+ADO+Postgres
    #33214777
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlТеоретически VCL это все уже само делать умеет, но к сожалению не достаточно хорошо....
Простите, а чем не устраивает конкрентно ?

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Builder+ADO+Postgres
    #33216322
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабас White OwlТеоретически VCL это все уже само делать умеет, но к сожалению не достаточно хорошо....
Простите, а чем не устраивает конкрентно ?
Ну в частности уже описаной в начале топика проблемой с чтением автозаполняемых полей. Но главная проблема в излишне запутаной и нестабильной работой c master-detail таблицами. А если количество detail-таблиц больше одной - вообще вешалка наступает.
Поэтому лично я всегда предпочитаю самостоятельно выделять память, и самостоятельно заполнять ее из резалт-сетов. На долю VCL и/или других GUI библиотек я оставляю только отображение и редактирование данных из моих собственных массивов. Потом самостоятельно формирую INSERT/UPDATE/DELETE команды. Этот подход меня ни разу не подводил :)
...
Рейтинг: 0 / 0
Builder+ADO+Postgres
    #33216640
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Понятно, т.е. в принципе претензии только к АДО-компонентам, а не к VCL в целом. Я IBX пользую, там с этим все нормально.

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Builder+ADO+Postgres
    #33219109
Denissio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Постепенно удалось разобраться почти со всеми проблемами, с которыми
столкнулся. И тут вылезла классическая ошибка: "BOF или EOF имеет значение
True, либо текущая запись удалена". Происходит она при удалении последней
записи из датасета, после вызова ApplyApdates. Поискал на форумах - народ
пишет о разных случаях возникновения такой ошибки, но только не о таком как
у меня. Предлагалось скачать апдейты, в т.ч. и для Дельфи. Все скачал,
установил - бестолку. Главное не удается отловить момент когда эта ошибка
происходит.

Может кто знает?


Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Builder+ADO+Postgres
    #33237168
Botik84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а у меня возникла проблема при работе с TADOQuery
нужно было выполнить команды вставки и удаления SQL
при этом я сначала пользовался методом Open() для выполнения запроса на что получил исключение Edatabaseerror
посмотрел в литературе что надо использовать ExecSQL();
но требуется чтобы запрос был выполнен вне зависимости от того SELECT или INSERT...
написал примерно следующее:
try
{TQuery->Clear();
TQuery->Add(SQLText);
TQuery->Open();
}
catch(EDatabaseError&)
{TQuery->ExecSQL();
}
но после ентого стал получать сообщение о том что запись уже вставлена.....получается исключение есть ...и запись вставлена методом
Open()..что это такое я не понял.....а тем более как с ентим бороться...
если можете помогите пожалуйста..
...
Рейтинг: 0 / 0
Builder+ADO+Postgres
    #33237181
Denissio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Botik84а у меня возникла проблема при работе с TADOQuery
нужно было выполнить команды вставки и удаления SQL
при этом я сначала пользовался методом Open() для выполнения запроса на что получил исключение Edatabaseerror
посмотрел в литературе что надо использовать ExecSQL();

Вообще не понятно в чем проблема.
В инструкции сказано: использовать Open() для запросов, возвращающих данные (SELECT), а ExecSQL() для не возвращающих (INSERT, DELETE и т.п.)

Вот:
Документация BCBCall ExecSQL to execute the SQL statement currently assigned to the SQL property. Use ExecSQL to execute queries that do not return a cursor to data (such as INSERT, UPDATE, DELETE, and CREATE TABLE).

ExecSQL returns an integer value reflecting the number of rows affected by the executed SQL statement.

Note: For SELECT statements, call Open instead of ExecSQL or set the Active property to true.
...
Рейтинг: 0 / 0
Builder+ADO+Postgres
    #33237902
Botik84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я создаю приложение для MSSQL , проблема в том что метод Open(); как это ни удивительно вставляет запись....при использовании INSERT.
Соответственно приведённый выше код дважды пытается вставить одну и ту же запись в БД. От этого возникает ошибка....мой вопрос в том как можно сделать чтобы выполнялся любой запрос к базе не взирая INSERT это или SELECT
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Builder+ADO+Postgres
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]