問題タブ [anydac]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - FireDacコンポーネントを使用してms sqlサーバーで最後に挿入されたIDを取得するには?
FireDacで、ms sqlサーバーで最後に挿入されたIDを取得する方法は? ありがとう
database - データへの複数の同期アクセスを改善する
はじめに太字を多用しておりますことをお詫び申し上げます。私の長い質問の仕方を簡単に理解したかったのです。
データへの複数アクセスに問題があります。
次の問題を実装する必要があります。多くの (約 100) TCP 接続を持つサーバー アプリケーションSERVER_A (TIdServer に基づく) があります。これらの接続のそれぞれの目的は次のとおりです。
- CLIENTからステータス メッセージ (2 ~ 5 秒ごと) を取得します。ステータスには、テキストとして保存された 3 つの二重数値が含まれます。
- SERVER_A からCLIENTに回答を送信- ステータスを取得した後
これらのステータス (約 100) は、Firebird データベース テーブル - TABLE (私はこの AnyDAC を使用しています) に保存する必要があります。各CLIENTには、その番号とそのレコードがTABLEにあります。
3 つの別のローカル ネットワーク クライアント アプリケーション - LOCAL_APPLICATIONSもTABLEにアクセスする必要があります。TABLEからの統計データを視覚化する必要があります。
LOCAL_APPLICATIONSは、 TABLEのレコードの 1 つを変更する必要がある場合があります。結果として、この変更は、応答としてSERVER_Aの TCP 接続を介して適切なCLIENTに配信される必要があります。
問題は、そのような解決策が達成される効率にあります。
これまでのところ、すべての TCP 呼び出しが個別にTABLEにデータを書き込み、Firebird に大規模な過負荷を引き起こし、LOCAL_APPLICATIONSによる操作はいずれ も非常に低速です。
したがって、私は尋ねることができます:正しいアプローチは、SERVER_AにLOCAL_ARRAYを構築し、すべての TCP 接続からデータを収集し、それらすべてを一定の時間間隔で定期的に (たとえば 2 秒ごとに) TABLEに保存することですか? もしそうなら、効率的なデータ同期を行う方法: LOCAL_ARRAYのロックを変更し、そこからデータを読み取ってTABLEにデータを保存する間にロックしますか?
接続ステータスごとに単一の変数を使用し、LOCAL_ARRAYを使用して、1 つのCLIENTからデータを挿入する際にLOCAL_ARRAYのすべてのフィールドをロックしないよう にすることをお勧めします。しかし、それは柔軟な解決策ではありません。
私のアイデアは効率を上げるのに良いですか?というかそうじゃない?より良い解決策は何ですか?
よろしく Artik
sqlite - AnyDAC (FireDAC) を使用して SQLite テーブルからタイル データ (MBTiles) を読み取る最も効率的な方法は何ですか?
バックグラウンド:
私は SQLite タイル キャッシュ データベース (仕様と同様) に取り組んでおり、現在は次の列を持つMBTiles
単一のテーブルから構成されています。Tiles
X [INTEGER]
- 水平タイル インデックス (地図座標ではない)
Y [INTEGER]
- 垂直タイル インデックス (地図座標ではない)
Z [INTEGER]
- タイルのズーム レベル
Data [BLOB]
- タイル画像データ (現在は PNG 画像) を含むストリーム
タイル計算へのすべての座標はアプリケーションで行われるためSQLite R*Tree Module
、対応するTADSQLiteRTree
クラスの は私には意味がありません。Data
必要なのは、指定された値で見つかったレコードのフィールド BLOB ストリームをX, Y, Z
できるだけ速くロードすることだけです。
アプリケーションには、このデータベースを除いて、次のようなハッシュ テーブルによって実装されるメモリ キャッシュもありますTTileCache
。
X, Y, Z
値を計算しながら特定のタイルを要求する場合のワークフローは単純になります。メモリ キャッシュのタイルを要求します (アプリの起動時に上記の表から部分的に埋められます)。そこでタイルが見つからない場合は、データベースに要求します (タイルが見つからない場合でも、ダウンロードします)。タイル サーバーから)。
質問:
見つかったブロブ ストリームのオプションの読み込みを使用して、SQLite テーブル (たとえば、100k レコード) 内の 3 つの整数列値を頻繁にクエリするために、どの AnyDAC (FireDAC) コンポーネントを使用しますか?
使用しますか:
- クエリ型コンポーネント (準備された同じクエリを実行すると効率的かもしれませんよね?)
- メモリテーブル(タイルテーブルに数GBが保存されている可能性があるため、サイズが心配です。または、たとえば何らかの方法でストリーミングされますか?)
- 何か違います ?
sql-server - FireDAC SQL Server 接続: 信頼されていない証明書
SQL Server で自己署名証明書を選択して、安全な接続を有効にしました。
SQL Server Management Studio を使用して に追加TrustServerCertificate=True
して接続できますAdditional Connection Parameters
。
同様のエラーが発生するため、FireDAC接続にも同じ構成が必要です
SSL プロバイダー: 証明書チェーンは、信頼されていない機関によって発行されました
接続しようとすると。
これを FireDAC に伝える方法は? (Delphi XE4、FireDAC: 8)
PS: 自己署名証明書を Windows の「信頼されたルート証明機関」に既に追加しましたが、FireDAC はそれを無視しているようです。
ありがとう
delphi - AnyDac - インメモリ sqlite db から切断するには?
Delphi XE2 で AnyDac を使用してインメモリ SQLite データベースを使用しています。プログラムを再起動した後、最初にデータベースに接続するのを忘れた場合でも、クエリが結果を返すことに気付きました。これは、おそらく AnyDac の自動接続機能が原因です。問題は、これは、プログラム自体が終了した後もメモリ内データベースがメモリ内にとどまることを意味するに違いないということです。これは一種のメモリ リークです。
AnyDac のドキュメントを調べてオンラインで検索しましたが、AnyDac を正しく使用してデータベースから切断する方法が見つかりませんでした。TADConnection の「close」メソッドを呼び出すと、sqlite ファイルが開いたままになっているように見えることに気付きました。インメモリデータベースでも同じことが起こると思います。
インメモリ SQLite データベースを正しく安全な方法で完全に閉じ、切断し、削除する方法を教えてください。
delphi - Delphi の blob タイプの計算フィールドを使用した TADQuery
Anydac コンポーネントを使用してデータベースにアクセスしています。TADOQuery は、SQL データベースからデータを選択するためのものです。
フィールドの 1 つはテキストですが、このテキストの代わりに RTF を表示する必要があります (同じテキストですが、単語が強調表示されているなど)。BLOB型の計算フィールドを作成し、TADQueryのOnCalcFieldsイベントで正しい値(DBからの原文+一部加工)を入れてみました。しかし、うまくいきません。アプリの起動時に AV を取得します。
「フィールド 'xxx' を計算フィールドまたはルックアップ フィールドにすることはできません。」.
FieldKind プロパティを fkInternalCalc (デフォルト値は fkCalculated) に変更すると、アプリが起動しますが、値を設定しようとすると OnCalcFields で AV が発生します。
"編集または挿入モードではないデータセット。"
(BLOB フィールドの代わりに) 計算文字列フィールドを定義すると、すべて問題ありませんが、文字列型には別の問題があります。文字列型の場合、テキストの最大サイズを制限する Size プロパティを提供する必要があります。また、64k を超える値 (たとえば 67000) を使用すると、OnCalcFields イベント ハンドラーで値 (短い値でも!) を割り当てようとすると AV が発生します。
プロジェクト xxx.exe は、"0x004094fc でのアクセス違反: アドレス 0xfffffffc の読み取り" というメッセージと共に例外クラス $C0000005 を発生させました。
そのため、計算 BLOB フィールドも計算文字列フィールドも作成できません。(最大サイズに制限があり、実際に安全な最大サイズに関する情報はありません。サイズが 64k を超えると問題が見つかりましたが、小さいブロックで安定するかどうかはわかりません。)
私が間違っていることはありますか?
更新:現時点では、別の方法で実装しました。プレゼンテーション レイヤーのデータを置き換えますが、これは単なる回避策であり、疑問はまだ残っています。Delphi で BLOB 型の計算フィールドを使用することは可能ですか (できれば Anydac TADQuery を使用)? 文字列型の計算フィールドの制限に関する情報はありますか (または、誰かがそれらを回避する方法を経験している可能性があります)。
したがって、TADQuery にはいくつかの SQL クエリがあり、いくつかのフィールドが定義されています + BLOB 型の 1 つの計算フィールド + OnCalcFields イベント ハンドラー (コードは上にあります)。アプリを起動すると(そしてクエリを開こうとすると)AVが生成されます。私が試した他のことは、以前に説明されていました。
sqlite - BLOB データを含む配列 DML コマンドを実行することは可能で意味がありますか?
パラメータ配列のBLOBフィールド・データを渡す配列DMLINSERT
または文を実行できますか? UPDATE
そして、私の質問のより重要な部分は、可能であれば、BLOB データを含む配列 DML コマンドは、コマンドを 1 つずつ実行するよりも効率的ですか?
TADParam
インデックス付きプロパティがあることに気付いたので、可能かもしれないと思いますが、パフォーマンスについての言及もこれを示す例もなく、インデックス付きプロパティのタイプが私のニーズにあまり適していないAsBlobs
ため、まだ試していませんRawByteString
.
私は FireDAC を使用しており、SQLite データベースを使用しています (したがって、複数のParams.BindMode = pbByNumber
ネイティブ SQLite を使用しています)。私の目標は、非常に小さな BLOB データ (レコードあたり約 1kB) を含む約 100,000 レコードをできるだけ速く (FireDAC の抽象化を犠牲にして) 格納することです。INSERT
VALUES
delphi - XE4 での FireDac のインストールが失敗する
コンピュータに Delphi XE 4 Enterprise Update1 をインストールしました。Fire DAC 8.0.5.3365 をインストールしようとしましたが、インストール中に次のような多くのエラーが発生しました。
何が間違っている可能性がありますか? 私のPCにもDelphi 2007がインストールされていますが、XEと競合する可能性があります