我正在编写一个使用C ++ Berlin检查通用SQLite数据库的程序。我有一个OnTitleClick事件,该事件在对字段进行升序或降序排序之间进行切换。我的问题是,当我单击“ ClassName”列标题时,该列的地址会更改,这会导致程序出错。单击任何其他列按预期工作。我用sqlite3.exe查看了“ ClassName”字段中的数据,一切看起来都很好。
为帮助进行故障排除,我添加了Edit1 TEdit控件来监视“列”地址中的更改。
我编写了另一个小型测试程序来解决问题,但问题仍然存在。
注意:数据库和其他数据库中的其他SQLite表中也会出现此问题。出现问题的字段始终会出现问题。没有问题的字段永远不会出现问题,因此它不是随机的。该问题似乎也与数据类型无关。某些具有整数类型的字段和某些具有varchar类型的字段会出现问题,但并非所有具有这些字段的字段都会出现问题。
以下控件为主要形式: 数据库网格 TEdit
以下控件位于DataSource文件中: FDPhysSQLiteDriverLink1 FD连接 FD查询 数据源
除了设置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整数主键非空,ClassName Varchar(255)非空,DayOfWeek整数CHECK(DayOfWeek在0和6之间)非空,SGActive布尔默认值1非空,ModifiedBy Varchar(25),ModDate double)>
当在此表中单击“ MemberInfoID”列标题时,为什么对数据库进行排序的代码会覆盖“列”地址?
我知道列地址应该在第一次单击列标题时更改,但在以后的单击中不会更改。
关于... 伯爵·斯泰利