У меня есть 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. Обратите внимание, что обе базы данных имеют одинаковую структуру и порядок столбцов.

0
relayman357 11 Апр 2018 в 00:48

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();
1
Remy Lebeau 12 Апр 2018 в 03:12