dbExpress/Ключ не указан

Я работаю над программой базы данных, используя компоненты dbExpress (Delphi 7). Данные извлекаются из базы данных через следующие компоненты: TSQLDataSet -> TDataSetProvider -> TClientDataSet -> TDatasource -> TDBEdit. До сих пор форма работала корректно. Запрос в TSQLDataset:

select id, name, byteken, timeflag from scales where id = :p1

Я добавил большое (2048) поле varchar в таблицу базы данных; когда я добавляю это поле в вышеуказанный запрос (и подключаю либо TDBMemo, либо TDBRichEdit) к TDatasource), я получаю следующее сообщение, когда пытаюсь отредактировать значение в новом текстовом поле

Unable to find record. No key specified.

Я получаю ту же ошибку, когда на форме нет TDBMemo (но с полем varchar в запросе). Как только я удаляю поле varchar из запроса, все снова работает правильно.

В чем может быть причина этой проблемы?

==== Дополнительная информация ====

Теперь я определил постоянные поля в форме. Поле, которое содержит ключ к таблице, имеет флаги провайдера, установленные на [pfInUpdate,pfInWhere,pfInKey], тогда как все остальные поля имеют свои флаги как [pfInUpdate,pfInWhere]. Это не решает проблему.

Постоянные поля были определены в клиентском наборе данных. Когда я определил их в TSQLDataSet, сообщение об ошибке «ключ не указан» не появляется.Программа по-прежнему выдает это сообщение об ошибке (которое я забыл упомянуть ранее):

EDatabase error: arithmetic exception, numeric overflow or string truncation

Поле большой строки имеет правильное значение в параметрах 'displaywidth' и 'size'.

==== Еще больше информации ====

Я переписал форму, чтобы использовать компоненты, не поддерживающие данные. Один запрос извлекает данные из базы данных (используя точно такую ​​же строку запроса, как я использую в TSQLDataSet); затем данные передаются в элементы управления. После того, как пользователь нажимает кнопку OK в форме, данные передаются обратно в базу данных через другой запрос, который выполняет обновление или вставку. Поскольку это работает правильно, я не вижу проблемы с компонентами, поддерживающими данные.

==== Еще один фрагмент информации ====

Я нашел этот вопросв Stack Overflow, который, кажется, решает аналогичную проблему. Я изменил запрос на

select id, name, name, byteken, timeflag, 
cast (constext as varchar (2048)) as fconstext
from scales
where id = :p1

и установил для поля данных dbMemo значение «fconstext». После добавления текста в dbMemo вызов 'applyupdates' теперь завершается со следующим сообщением

column unknown 'fconstext'

, несмотря на то, что существует постоянное поле, созданное с таким именем.

Я не знаю, помогает ли это или просто мутит воду.

==== Дополнительная информация, 23 апреля ====

Я удалил это поле из таблицы базы данных, а затем добавил его обратно. Написанная программа работает нормально, пока строка, вводимая в проблемное поле данных, не превышает 260 символов. Я добавлял по десять символов несколько раз без проблем, пока длина строки не стала 256. Потом я добавил еще несколько символов (не считая), попытался сохранить - и получил ошибку.С этого момента попытка добавить даже еще один символвызывает сообщение об ошибке (которое приходит в методе 'applyupdates' клиентского набора данных).

Первоначально поле содержало 832 символа, поэтому нет жесткого ограничения на количество символов, которые я могу успешно сохранить. Но как только появляется сообщение об ошибке, оно всегда появляется, как будто база данных помнит, что произошла ошибка.

==== Дополнительная информация, 24 апреля ====

Еще раз, я удалил поле из базы данных, а затем добавил его обратно; набор символов WIN1251, по непонятным мне сейчас причинам (кириллица мне не нужна). Максимальное количество символов, которое я могу ввести с помощью элементов управления с поддержкой данных, кажется, составляет около 280, независимо от того, как определено само поле.

С тех пор я перешел к использованию элементов управления, не поддерживающих данные, в реальной программе, где возникает эта проблема, и я могу заверить вас, что этого ограничения там не существует. Таким образом, я совершенно уверен, что проблема не в несоответствии размера символов, как предполагалось. Не забывайте, что я использую Delphi 7, в котором нет строк Unicode. Я думаю, что есть ошибка в одном из компонентов, но поскольку я использую старые версии, я думаю, что проблема была решена, но не в тех версиях, которые я использую.

==== Надеюсь, окончательное редактирование, 25/04/12 ====

Следуя совету mosquito, я создал новую базу данных с набором символов по умолчанию WIN1252 (UTF-8 не отображался как выбор и и в любом случае мои программы не юникод).В этой чистой базе данных я определил одну таблицу, в которой набор символов строки «контекст» также был определен как WIN1252. Я запустил версию проблемной формы с поддержкой данных и смог без проблем вводить текст (в настоящее время более 1700 символов).

Казалось бы, таким образом,что проблема возникла из-за того, что для базы данных был определен один набор символов, а другой — для поля. Я не знаю, как ретроспективно проверить, как был определен набор символов по умолчанию для базы данных, поэтому я не могу это подтвердить.

Теперь у меня есть небольшая проблема с определением новой базы данных (есть более 50 таблиц) и копированием данных из исходной базы данных. Поскольку эта база данных обслуживает флагманский продукт клиента, я несколько опасаюсь этого делать....

6
задан Community 23 May 2017 в 11:58
поделиться