問題タブ [tclientdataset]

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.

0 投票する
1 に答える
1036 参照

delphi - マスター詳細の TClientDataset が詳細クエリを閉じない

1 つのプロバイダーを使用して、Master Detail に 2 つの ClientDatasets があります。基礎となる 2 つのクエリはマスター詳細としてデータソースに接続され、マスターにはフィールド (TDatasetField) として詳細があります。

私の問題は、マスター (および詳細) データセットを閉じると、マスター クエリが閉じられますが、詳細が閉じられないことです...後で同じパラメーターを使用して同じクエリを再作成しようとすると、問題が発生します。

とにかく詳細クエリを閉じる必要があると思います...

助けはありますか?

ありがとう

0 投票する
1 に答える
727 参照

c++builder - VCLコンポーネントを使用して、非常に大きなデータセットをグリッドに表示する

私のC++CADアプリケーションは、ユーザーのモデリング操作のログを保持しているため、適用を解除して再適用することができます。特定のプロジェクトには、ほんの数回の操作が含まれる場合もあれば、数十万回の操作が含まれる場合もあります。このデータをメモリ効率の高い方法で管理するための独自のデータ構造がすでに用意されており、これはうまく機能しています。しかし今、私はユーザーがグリッドで自分の操作ログを検査できるようにする機能を追加しています。(私はEmbarcadero RAD Studio 2010を使用しています。すべてのGUIはVCLを使用しています。)

現在、TDBGridコンポーネントを使用して、操作データを行でユーザーに表示しています。コンポーネントを接続する方法は次のとおりです。

TDBGrid.DataSource = TDataSource

TDataSource.DataSet = TClientDataSet

TClientDataSet.ProviderName = TDataSetProvider

TDataSetProvider.DataSet = ProjectDataSet

ProjectDataSetは、TDataSetから派生したクラスです。

データベースからではなく、自分のデータ構造から操作データを取得しているため、ProjectDataSetクラスのGetFieldData関数とGetRecord関数(およびその他のいくつか)をオーバーライドして、自分のデータ構造から直接データを返すようにしました(データベースクエリ)。これは機能します。

多くの操作を表示するときのメモリ使用量を最小限に抑えるために、TClientDataSetで「FetchOnDemand」プロパティを設定し、「PacketRecords」を100に設定しました。したがって、最初は最初の100個の操作のみがグリッドに表示されます。ユーザーがグリッドの一番下までスクロールすると、次の100個の操作がTClientDataSetによって自動的にフェッチされ、グリッドに表示されます。

これはすべて非常にうまく機能します。私の問題は、ユーザーがグリッドをスクロールすると、TClientDataSetが何もリリースせずにますます多くのレコードをフェッチし続けることです。したがって、非常に大規模なプロジェクトでユーザーが十分に下にスクロールすると、最終的にメモリが不足します。

だから、私の質問は、このGUIを機能させるための最良の方法は何ですか?基本的に、グリッドをスプレッドシートのように動作させたいと思います。操作の数に関係なく、ユーザーが操作リストを上下にスクロールできるようにする(または特定の行にジャンプできるようにする)必要があります。また、GUIコンポーネントがメモリ内に多くのものを保持することは望ましくありません。ユーザーは差し迫った必要はありません。

TDBGrid(または他のVCLコンポーネント)は、一度に少数のレコードのみをフェッチすることで任意の大きなデータセットを表示できるように設計されていると思いますが、それはどのように行われるのでしょうか?

GUIを再考する必要がある場合は、それで問題ありません。しかし、同じGUIを使用して10操作のプロジェクトまたは100,000操作のプロジェクトを表示できれば本当に素晴らしいと思います。

ありがとう。

0 投票する
2 に答える
1022 参照

performance - ClientDataset パフォーマンス TBlobfields

TClientDataset を開き、3 つの TBlobfields を含む 10.000 行をフェッチするには3 分かかります。

まったく同じデータを開きますが、BLOB フィールドを Varchar としてキャストすると、1 秒かかります。

唯一の違いは、TQuery (または TsqlQuery) には TBlobfield ではなく TStringfield があることです。しかし、データは同じです。ファイルに保存されたテーブル全体は、約 3 MB です。TsqlQuery、または (firebird) データベースに接続するための TQuery を使用しても同じ結果が得られます。

データベースはサーバー上にあり、Firebird 2.1 を実行しています。クライアントでデータベースを実行すると(両方とも1秒未満)、違いがなくなるため、ネットワークトラフィックに問題があると思われます...

さらに奇妙なことに、Clientdataset が実際に BLOB フィールドで満たされているかどうかは問題ではありません。したがって、clientdataset に永続フィールドが 1 つしかない場合 (number integer)、パフォーマンスは同じです...

このバグ(?)は私にとって大きな問題です...誰かがこれを説明してくれることを願っています...

0 投票する
1 に答える
1708 参照

delphi - DelphiでSOAPを使用してSOAPを介してクライアントデータセットにデータをリモートで読み込むときにTXMLTransformから送信されるXML解析エラーとはどういう意味ですか?

少し前に、別のSOAP関連の質問をしました。これは、DelphiXE以降で動作するSoapクライアントとサーバーを要求します。

箱から出してすぐに解決策を持っている人は誰もいなかったので、Delphi2007時代のデモをDelphiXEおよびXE2の動作状態に復元しました。デモが機能していて、SOapサーバーを備えたINDY VCLフォームベースのサーバー(Indyで実行されているスタンドアロンのHTTPサーバー)があります。サーバーデモの2つの部分は、「カスタムメソッド」(通常のsoap関数呼び出し)と「リモートデータセット」です。動作させることができないのはリモートデータセットです。

クライアントデータセットをアクティブに設定すると、クライアントフォームにエラーが発生します。デモクライアントでこの行を実行すると、サーバーから例外が返されます。

これは次にDBClient.pasコードになり、 このRIO呼び出しによって、から読み取ろうとしているTDataSet.OpenCursor呼び出し を行います。DoGetRecordsProviderName = 'XMLTransformProvider1'

MessageBoxこれは、典型的な形式で示されるこの例外で爆発します。

Indy SoapDataModuleのサーバー側の例外呼び出しスタックを次に示します。

私が起こっていると思うのは、空のHTTP応答を受け取っているということです。何も機能せず、アクセスしているHTTP URLが機能しない場合、これは私にとって完全に理にかなっています。アクセスしているURLは次のとおりです。Webブラウザからアクセスできます。

エラーメッセージの原因となったクライアントに戻ってくるXMLは次のようになります。

私の質問は、そのSOAPエラーは実際には何を意味し、なぜそれが発生するのか、そしてどのように修正するのかということです。

0 投票する
1 に答える
429 参照

c++ - CDSクライアントデータセットファイル-これらを操作する別の方法はありますか?

Delphi IClientTableインターフェイス(MIDAS.DLL ??)を使用してローカルファイルデータベース(.CDSファイル)を維持するC++アプリケーションがあります。C ++アプリケーション内では、IClientTableはCOleDispatchDriverMFCインターフェイス/オブジェクトです。

私は個人的にこれから完全に離れてSQLiteを使用したいと思っていますが、残念ながら私は現在これを行う立場にありません。

このCOMオーバーヘッドのオープンソースの代替品があるかどうか誰かに教えてもらえますか?単純なDLL、ライブラリ、またはソースファイルのセットをプログラムにコンパイルして、COMインターフェイスを削除したいのですが、これは非常に悲惨なことです。

なぜ私がCOMインターフェースを削除したいのかを本当に知りたいのであれば、それは奇妙なことですが、私たちは10年間問題なく使用してきました。最近、Windows XP Embeddedを使用している顧客を見つけました。何らかの理由で、IClientTable COMディスパッチインターフェイスを使用すると、Windows WM_QUERYENDSESSIONメッセージが吸収されるか、アプリケーションに到達しなくなります。IClientTableインターフェイスの使用を停止すると、WM_QUERYENDSESSIONメッセージが表示されます。

つまり、IClientTable COMディスパッチインターフェイスは、Windowsによるログオフ/シャットダウンの許可を停止しているように見えます。

0 投票する
1 に答える
688 参照

xml - TXMLTransformProvider 使用時の XML ノードの順序の制御

TXMLTransformProvider を使用して、TClientDataSet を使用して XML ファイルを編集しています (これはかなりクールです)。主キーなどを使用して、XML ファイル内のノードの順序を制御できるようにしたいと考えています。しかし、ClientDataSet1.ApplyUpdates を実行すると、新しいレコードは、好みの順序 (DBGrid で表示される順序) ではなく、XML ファイルの末尾に追加されます。注文を保存する簡単な方法はありますか?それとも、データを保存するために TXMLTransformProvider を破棄し、TXMLDocument を使用して手動でコーディングする必要がありますか?

0 投票する
2 に答える
4490 参照

database - データベーステーブルの制約によるTClientDatasetApplyUpdatesエラー

1つのデータベーステーブルからデータをロードし、多くの操作と計算を行い、最終的に宛先テーブルにレコードを書き込む古いDelphi7アプリケーションがあります。

この古いアプリケーションは、パフォーマンス上の理由から、500レコードごとにApplyUpdatesを呼び出します。

問題は、この一連のレコードに、データベースの制約をトリガーするレコードが存在する場合があることです。Delphiは、ApplyUpdatesで例外を発生させます

私の問題は、どのレコードがこの例外の原因であるかわからないことです。500人の候補者がいます!

問題のあるレコードであるTClientDatasetに問い合わせることは可能ですか?

速度の問題のために、追加されたレコードごとにUpdatesを適用したくありません。

0 投票する
1 に答える
2874 参照

delphi - ClientDataSet の Locate メソッドが存在するレコードを見つけられないのはなぜですか?

時々、私には予測できないように見える方法で、コード行

レコードあることを知っていても、真に解決されます (つまり、「名前」フィールドに文字列が見つかりません)。アプリケーションを閉じて再度開き、まったく同じファイルをロードして、まったく同じコマンドを実行し、つまり、すべてのアクションを繰り返して、次回からすべてが期待どおりに機能するようにできます。そしてその後の時間。同じファイルを再度開くだけでも、コードは期待どおりに実行されます...問題が何であるかはわかりません。率直に言って、このような断続的なものでは、どこを見ればよいかさえわかりません!aName

どこから始めるべきかについて何か考えはありますか? ...

0 投票する
4 に答える
11461 参照

delphi - データセット構造から別の構造にデータを移動するためのより高速な方法(TDatasetProvider内)

提供するデータに新しいフィールドを作成できるカスタムTDatasetProviderがあります。

したがって、元のデータセットに次のフィールドがあるとします。

  • 顧客ID
  • 名前

また、ビットマップの表示を使用してDBGridで選択する必要があります。私のDSPはデータセットデータに呼び出されるブールフィールドを追加できるので、そうすることができSelectedます。

私が今それをする方法:

  1. 2つのTClientDatasetオブジェクト(オリジンとターゲット)を作成します
  2. Originで、InternalGetRecordsメソッドのパラメーターから取得したデータをロードします(オーバーライドします)
  3. Targetでは、Originデータセットから定義されたfielddefを作成し、開発者が設計時に作成したfielddefを追加します。
  4. ターゲットでCreateDatasetを実行します
  5. そして、行ごと(およびフィールドごと)に、OriginデータベースからTargetデータセットにデータをコピーします
  6. 最後に、InternalGetRecordsからの戻り値としてDataバリアントを返します。

それを行うためのよりエレガントな(そしてより速い)方法があるかどうかは本当にわかりません。その結果を得る別の(より速くおよび/またはエレガントな)方法はありますか?

0 投票する
1 に答える
826 参照

delphi - DELPHI: 詳細がグリッドにあるマスター詳細に計算値を入力します

ClientDataSets (サービスとアドオン) を使用してマスター/詳細関係を作成しました。サービスは DBLookupComboBox (cboServices) に表示され、サービスが選択されると、アドオンが DBGrid (grdMain) に表示されます。

アドオンには、アドオンが選択されていることを示すチェックボックス、名前フィールド、ユーザーが変更できる数量フィールド、単価フィールド、および合計価格フィールドがあります。

単価と数量を使用して合計金額を更新する OnQuantityChange メソッドを作成しましたが、行から実際のデータを取得して更新するにはどうすればよいですか? 次のようなことを行うために、さまざまなフィールドを参照するにはどうすればよいですか。