【问题标题】:insert new record from TFDquery into another sqlite db (firemonkey)将来自 TFDquery 的新记录插入另一个 sqlite 数据库(firemonkey)
【发布时间】:2018-04-10 21:48:36
【问题描述】:

我有 2 个 SQLite 数据库。我想从一个中取出几条记录并将它们插入到另一个中。这样做的好方法是什么?我在下面显示问号,我不确定我需要什么...

TFDQuery *queryNEWDATA;
queryNEWDATA = new TFDQuery(NULL);
queryNEWDATA->Connection = Form1->FDConnection1;   
queryNEWDATA->SQL->Text = "SELECT * FROM mtgs WHERE status = 4";  
queryNEWDATA->Open();
while(!queryNEWDATA->Eof) 
{
  TFDQuery *queryUPDATE;
  queryUPDATE = new TFDQuery(NULL);
  queryUPDATE->Connection = Form1->FDConnection2; 

  queryUPDATE->SQL->Text = ????????????????

  queryUPDATE->ExecSQL();
  queryUPDATE->Close();
  queryUPDATE->DisposeOf();
}

如果我的queryNEWDATA 返回 4 条记录,我只想用queryUPDATE 将它们推送到另一个数据库中。请注意,两个数据库具有完全相同的结构和列顺序。

【问题讨论】:

    标签: sqlite firemonkey c++builder-10.2-tokyo


    【解决方案1】:

    我不知道这是否是最好的方法,但试试这样的方法:

    TFDQuery *queryNEWDATA = new TFDQuery(NULL);
    queryNEWDATA->Connection = Form1->FDConnection1;   
    queryNEWDATA->SQL->Text = _D("SELECT * FROM mtgs WHERE status = 4");
    queryNEWDATA->Open();
    
    if (!queryNEWDATA->Eof) 
    {
        TStringList *FieldNames = new TStringList;
        TStringList *ParamNames = new TStringList;
    
        int FieldCount = queryNEWDATA->Fields->Count;
        for (int i = 0; i < FieldCount; ++i)
        {
            String FieldName = queryNEWDATA->Fields->Fields[i]->FieldName;
            FieldNames->Add(FieldName);
            ParamNames->Add(_D(":P") + FieldName);
        }
    
        TFDQuery *queryUPDATE = new TFDQuery(NULL);
        queryUPDATE->Connection = Form1->FDConnection2;     
        queryUPDATE->SQL->Text = _D("INSERT INTO mtgs (") + FieldNames->CommaText + _D(") VALUES (") + ParamNames->CommaText + _D(")");
    
        FieldNames->DisposeOf();
        ParamNames->DisposeOf();
    
        for (int i = 0; i < FieldCount; ++i)
        {
            TField *f = queryNEWDATA->Fields->Fields[i];
            queryUPDATE->Params->ParamByName(_D("P") + f->FieldName)->DataType = f->DataType;
        }
    
        queryUPDATE->Prepare();
    
        do
        {
            for (int i = 0; i < FieldCount; ++i)
            {
                TField *f = queryNEWDATA->Fields->Fields[i];
                queryUPDATE->Params->ParamByName(_D("P") + f->FieldName)->Value = f->Value;
            }
    
            queryUPDATE->ExecSQL();
            queryNEWDATA->Next();
        }
        while (!queryNEWDATA->Eof);
    
        queryUPDATE->Close();
        queryUPDATE->DisposeOf();
    }
    
    queryNEWDATA->Close();
    queryNEWDATA->DisposeOf();
    

    【讨论】:

    • 谢谢雷米。我认为某处有一个额外的逗号。我添加了日志记录,发现代码在 queryUPDATE->Prepare() 处失败。失败前的查询UPDATE->SQL->Text 是 INSERT INTO mtgs (,,,,,,,) VALUES (:P,:P,:P,:P,:P,:P,:P,:P ,)
    • 我收到的异常消息是 [FireDAC][Phys][SQLite] ERROR near ",": syntax error
    • @relayman357 语法错误是抱怨打开( 后的第一个,。您显示的 SQL 文本意味着 Fields[i]-&gt;Name 正在返回一个不应返回的空白字符串。如果CommaText 在最后一个字符串之后输出一个逗号,那就是一个 RTL 错误。 SQL 应该看起来更像这样:INSERT INTO mtgs (Field1,Field2,Field3,...) VALUES (:PField1,:PField2,:PField3,...),其中Field# 是一个实际的字段名称,如status
    • FieldCount 记录为 8,这是正确的。我使用 queryNEWDATA->FieldByName("title")->AsString 转储了一个要记录的字段,它从数据库中的记录中显示了该字段的正确数据。
    • Remy,我将您的代码中的 1 行更改为 String FieldName = queryNEWDATA->Fields->Fields[i]->FieldName 并且出现新错误。新错误是:“[FireDAC][Phys][SQLite]-335。参数 [PPOS] 数据类型未知。提示:在 Prepare/Execute 调用之前指定 TFDParam.DataType 或分配 TFDParam 值。”请注意,我表中的第一个字段名为 POS。
    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2016-12-14
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多