You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:42:01