//+------------------------------------------------------------------+void CSQLite::DataBaseToFile(void)
{
uint flags=DATABASE_EXPORT_COMMON_FOLDER | DATABASE_EXPORT_QUOTED_STRINGS;
long count_rows=0;
string tables[],
file_name,
separator=";",
query="SELECT name FROM sqlite_master WHERE tbl_name <> 'sqlite_sequence' AND type='table'";
int total=GetValuesFromDataBase(query,tables); // ТУТ ВСЕ ОК, СПИСОК ТАБЛИЦ ИЗ БАЗЫ ПОЛУЧЕН.
if(m_handle==NULL)
Open();
for(int i=0; i<total; i++)
{
file_name=StringFormat("%s.%s",m_name,tables[i]);
count_rows=DatabaseExport(m_handle,tables[i],file_name,flags,separator); // ОШИБКА ПОСЛЕ ВЫПОЛНЕНИЯ ДАННОЙ ФУНКЦИИ
Print(StringFormat("Export file: %s, rows: %lld",file_name,count_rows));
if(count_rows<0)
Print("DB: ", m_name,", Table: ",tables[i], ", Import failed with code ", GetLastError());
elseif(count_rows>0)
Print(StringFormat("Import file: %s, rows: %lld",file_name,count_rows));
}
Finalize();
}
//+------------------------------------------------------------------+
明日のベータでは2840になる:
とても嬉しい、ありがとう
ベータ2840が利用可能です。
明日のベータでは2840になる:
例:
データベース作成ウィザードに新しい json タイプを含める予定です。
それを理解した人は、そのようなタスクの実装を示してほしい。
このタスクの枠組みの中で、両方の場合(Terminal2 でベースを読み取り、Terminal1 でベースに書き込む場合)、トランザクションメカニズムを通じて ブロックする必要があることを正しく理解していますか?
データベースが更新されたことを判断する最も安価な方法は何ですか?
根本的に間違っています。あなたが説明しているのは、分散クライアントサーバーアプリケーションで、1ライター、nリーダーのスキームです。このようなシステム(そして一般的な分散システム)を設計する場合、ロックフリーのデータ構成やアクセス方法を使用することで、ロックを回避するようにしなければなりません。もし使用する技術がロックなしを可能にしないのであれば、それはあなたのタスクにとって最適なソリューションではないかもしれません。
あなたの場合、本格的なサーバーをデプロイして(クライアントと同じマシン上で可能)、メッセージキューに引用を書き込むのがよいでしょう。クライアントは、必要なインデックスからこれらの引用を読み取る。これはロックフリーのデータアクセス方式である。
つまり、データ交換の 可能性はファイル経由よりも少ないということだ。
断じてノーだ。ファイル経由の共有はアトミックではないので、読み手側と書き手側の両方でロックが必要です。これはデッドロックを引き起こす最も確実な方法であり、見つけにくく理解しにくいエラーをキャッチするのに迷うことになる。
根本的に間違っている。あなたが説明しているのは、1ライター、nリーダーのスキームを持つ分散クライアント・サーバー・アプリケーションです。このようなシステム(そして一般的な分散システム)を設計する場合、ロックを避け、ロックフリーの方法でデータを整理し、それらにアクセスするようにすべきです。もし使用するテクノロジーがロックなしを可能にしないのであれば、それはあなたのタスクにとって最適なソリューションではないかもしれません。
あなたの場合、本格的なサーバーをデプロイして(クライアントと同じマシン上でデプロイできます)、メッセージキューに引用を書き込むのがよいでしょう。クライアントは、必要なインデックスからこれらの引用を読み取る。これはロックフリーのデータ・アクセス・スキームである。
断じて違う。ファイルを介した共有はアトミックではないので、読み手側と書き手側の両方でロックが必要になる。これはデッドロックを引き起こす最も確実な方法であり、見難く理解し難いエラーを捕らえることに没頭することになる。
詳細な回答をありがとう!残念なことに、当時自分がどんな問題を解決していたのかすっかり忘れていました。そのため、このトピックに関する私の考えを共有することができないのです。
ベータ2840が利用可能です。
このソリューションに関する質問
- 複数の EA が同じsqlite データベースを 同時に使用することに問題はありますか?
- MT5がクラッシュした場合、一部のデータが失われる可能性はありますか?データをディスクに書き込む頻度はどのくらいですか?
開発者の皆様、こんにちは!
関数 "DatabaseExport "がどうにも動きません...パラメータにテーブル名を指定するとエラー5601(クエリ実行エラー。クエリは実行しません)が出ます、
SQLクエリを指定すると、エラー4022(プログラム実行の キャンセル)が出ます。おそらくMQL関数内のエラーか、私のライブラリのコードの一部でしょう: