Я пишу программу, которая исследует общие базы данных SQLite, используя C ++ Berlin. У меня есть событие OnTitleClick, которое переключается между сортировкой поля по возрастанию или по убыванию. Моя проблема в том, что, когда я нажимаю на заголовок столбца «ClassName», адрес столбца меняется, что приводит к ошибкам в программе. Нажатие на любой другой столбец работает как ожидалось. Я посмотрел на данные в поле «ClassName» с sqlite3.exe, и все выглядит хорошо.
Чтобы помочь в устранении неполадок, я добавил элемент управления Edit1 TEdit, чтобы отслеживать изменения в адресе столбца.
Я написал еще одну небольшую тестовую программу для устранения проблемы, и проблема все еще возникает.
Примечание: проблема также возникает в других таблицах SQLite в базе данных и в других базах данных. Поля, которые показывают проблему, всегда показывают проблему. Поля, которые не отображают проблему, никогда не показывают проблему, поэтому она не случайна. Проблема также, кажется, не зависит от типа данных. Некоторые поля с целочисленными типами и некоторые поля с типами varchar представляют проблему, но не все поля с этими полями представляют проблему.
Следующие элементы управления находятся в основной форме:
DBGrid
TEdit
Следующие элементы управления находятся в файле источника данных:
FDPhysSQLiteDriverLink1
FDConnection
FDQuery
Источник данных
Кроме настройки драйвера и базы данных FDConnection, добавления SQL-кода в FDQuery и связывания DBGrid, DataSource и DataSet, все остальные свойства являются значениями по умолчанию.
Этот код ниже — весь код, который я написал. Остальное генерируется C ++ Berlin.
void __fastcall TForm2::DBGridDataTitleClick(TColumn *Column) {
Edit1->Text = int(Column);
AnsiString ColumnFieldName = Column->FieldName;
if ((ColumnToSort != NULL) && (ColumnToSort == Column))
SortAsc = !SortAsc;
else
SortAsc = true;
UnicodeString SQLString = "SELECT * From SSClass";
SQLString += " ORDER BY ";
SQLString += ColumnFieldName;
if (!SortAsc)
SQLString += " DESC";
/*
if I return here, the column address does not get overwritten.
If I comment the 'return' line out, the 'ClassName' column address is
overwritten in the following code:
*/
return;
DataModule3->FDQueryData->Close();
DataModule3->FDQueryData->SQL->Text = SQLString;
DataModule3->FDQueryData->Open();
ColumnToSort = Column;
}
Вот определения полей:
CREATE TABLE SSClass (SSClassID Integer PRIMARY KEY NOT NULL, ClassName Varchar (255) NOT NULL, DayOfWeek Integer CHECK (DayOfWeek МЕЖДУ 0 и 6) NOT NULL, SGActive Булево ПО УМОЛЧАНИЮ 1 НЕ NULL, ModifiedBy VARCAR (25)
Почему код для сортировки базы данных перезаписывает адрес «Столбец», когда в этой таблице щелкают заголовок столбца «MemberInfoID»?
Я знаю, что адрес столбца должен изменяться при первом нажатии на заголовок столбца, но не при последующих щелчках.
С уважением…
Эрл Стейли
Задача ещё не решена.
Других решений пока нет …