如何查询TFDMemTable?执行SELECT提示FDMemTable1表不存在如何解决
TFDMemTable 无法通过FDQuery查询的解决方案
错误原因
你当前的配置中,TFDQuery绑定的是独立的SQLite数据库连接,该连接的存储上下文和你内存中创建的TFDMemTable实例完全隔离,自然无法识别FDMemTable1这个表名。你仅仅修改了FDConnection1->ConnectionName的名称标识,并不会把内存表关联到SQL查询上下文。
解决方案
方案1:直接遍历TFDMemTable(推荐,无需SQL)
如果只是需要循环处理内存表数据,不需要额外引入TFDQuery,直接操作TFDMemTable本身即可,代码更高效简洁:
void __fastcall TForm2::Button1Click(TObject *Sender) { UnicodeString x; // 先定位到第一条记录 FDMemTable1->First(); while (!FDMemTable1->Eof) { x = FDMemTable1->FieldByName(L"FullName")->AsString; // 此处添加你的业务处理逻辑 FDMemTable1->Next(); } }
注意:使用前需要先给TFDMemTable定义字段结构,否则直接插入记录会报错,结构定义代码参考方案2的FormCreate部分。
方案2:通过LocalSQL注册内存表,支持SQL查询
如果确实需要用SQL语句查询内存表,使用FireDac自带的LocalSQL功能将TFDMemTable注册到连接的查询上下文即可:
步骤1:修改FormCreate初始化逻辑
void __fastcall TForm2::FormCreate(TObject *Sender) { // 第一步:定义FDMemTable1的字段结构,此步骤为必须操作 FDMemTable1->FieldDefs->Add(L"FullName", ftString, 50); FDMemTable1->FieldDefs->Add(L"SecondField", ftInteger); FDMemTable1->FieldDefs->Add(L"ThirdField", ftInteger); FDMemTable1->CreateDataSet(); // 初始化内存表结构 // 插入测试数据 FDMemTable1->InsertRecord(ARRAYOFCONST((L"Vic", 100, 30))); FDMemTable1->InsertRecord(ARRAYOFCONST((L"Jeong", 20, 20))); FDMemTable1->InsertRecord(ARRAYOFCONST((L"Christina", 400, 50))); FDMemTable1->InsertRecord(ARRAYOFCONST((L"Justina", 0, 60))); // 配置FDConnection使用内存SQLite数据库 FDConnection1->DriverName = L"SQLite"; FDConnection1->Params->Add(L"Database=:memory:"); FDConnection1->Connected = true; // 关键:将内存表注册到LocalSQL上下文,让SQL查询可以识别该表 FDConnection1->LocalSQL->Add(FDMemTable1); FDQuery1->Connection = FDConnection1; }
步骤2:原有查询逻辑无需修改
你原来的Button1Click代码可以正常运行,SELECT * FROM FDMemTable1会正确返回内存表中的数据。
内容的提问来源于stack exchange,提问作者Vic Fanberg
相关产品推荐
相关产品推荐

