C++Builder FireDAC, TFDBatchMoveを使いデータセットをコピーする方法[JAPAN]

Posted by on in Programming

FireDACのTFDBatchMoveを使いデータセットから別のテーブルに簡単に書き込む事ができます。

TFDBatchMove用のコンポーネントは下記です。

この中でTFDBatchMoveDataSetReader, TFDBatchMoveDataSetWriterを試してみました。

TFDBatchMoveDataSetReaderはコピー元になるDatasetを設定

TFDBatchMoveDataSetWriterにはコピー先になる空のDatasetを設定しました。

読み込み側のテーブルはMySQLを使いました。テーブルは下絵のような感じのシンプルなテーブルです。

これをFireDACのTFDConnection, TFDQueryなどを利用しDatasetとして扱えるようにします。

コピー先も同じく空テーブルは必要になりますので SQLiteでデータベースとテーブルを作成しました。

////
CREATE TABLE t_MotoGP 
(
  position int,
  racer_name text, 
  team_name text,
  point_sum int
)

これも同じく、TFDConnection, TFDQueryを使いDatasetを作成しました。

 

[コピーするコードをC++Builderのコンソールプロジェクトで実装します]

////
#include <vcl.h>
#include <windows.h>

#pragma hdrstop
#pragma argsused
#include <tchar.h>

#include <iostream>
#include "conf.h"

int _tmain(int argc, _TCHAR* argv[])
{
	TFDPhysMySQLDriverLink *mysql_driver 	= new TFDPhysMySQLDriverLink(nullptr);
	TFDPhysSQLiteDriverLink *sqlite_driver 	= new TFDPhysSQLiteDriverLink(nullptr);
	TFDConnection *mysql_connect 	= new TFDConnection(nullptr);
	TFDConnection *sqlite_connect 	= new TFDConnection(nullptr);
	TFDQuery *mysql_query 			= new TFDQuery(nullptr);
	TFDQuery *sqlite_query 			= new TFDQuery(nullptr);
	try
	{
		//Set MySQL driver. libmysql.dll
		mysql_driver->VendorLib     = dbparam_::mysql_libdll;
		//Set SQLite driver. sqlite3.dll
		sqlite_driver->VendorLib    = dbparam_::sqlite_libdll;
		mysql_connect->DriverName   = "MySQL";
		sqlite_connect->DriverName  = "SQLite";
		mysql_connect->Params->Text		= dbparam_::mysql_param;
		sqlite_connect->Params->Text    = dbparam_::sqlite_param;
		mysql_connect->LoginPrompt  = false;
		sqlite_connect->LoginPrompt = false;
		mysql_connect->Connected    = true;
		sqlite_connect->Connected   = true;
		mysql_query->Connection     = mysql_connect;
		sqlite_query->Connection    = sqlite_connect;
		//Prepare the same table in advance.
		mysql_query->SQL->Text      = "select * from t_MotoGP";
		//Prepare an empty table.
		sqlite_query->SQL->Text      = "select * from t_MotoGP";

		//Activate the table of differences.
		mysql_query->Active         = true;
		sqlite_query->Active         = true;

		std::unique_ptr<TFDBatchMove> batch_move = std::make_unique<TFDBatchMove>(nullptr);
		TFDBatchMoveDataSetReader 	*mysql_ds_read =  new TFDBatchMoveDataSetReader(batch_move.get());
		TFDBatchMoveDataSetWriter	*sqlite_ds_write =  new TFDBatchMoveDataSetWriter(batch_move.get());
		try
		{
			//Read side is MySQL
			mysql_ds_read->DataSet  	= mysql_query;
			//Write side is SQLite
			sqlite_ds_write->DataSet    = sqlite_query;
			try
			{
				//Copy the table data from MySQL to SQLite.
				std::cout <<
					"batch_move->Execute();" << std::endl;
				batch_move->Execute();
				sqlite_query->Active    	= false;
				sqlite_connect->Connected   = false;
			}
			catch (Exception& e1)
			{
				std::cout <<
					e1.Message.c_str() << std::endl;
			}
		}
		__finally
		{
			delete mysql_ds_read;
			delete sqlite_ds_write;
		}
	}
	__finally
	{
		delete mysql_query;
		delete sqlite_query;
		delete mysql_connect;
		delete sqlite_connect;
		delete mysql_driver;
		delete sqlite_driver;
	}
	return 0;
}

実行結果SQLiteのデータベーステーブルにコピーできた事が確認できました。

 

テストしたコードはGistにアップしています。

https://gist.github.com/mojeld/d2c85ea4f32fad8032f5240f5d0b91e2

 



About
Gold User, No rank,
Delphi / C++Builder blogger

Comments

Check out more tips and tricks in this development video: