問題タブ [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.
delphi - Delphi: ResolveToDataset の問題
TClientDataset
プロバイダーに次のオプションを指定してを使用しています。
プロバイダは、NO_INVOICE キーのジェネレータを管理する TIBCQuery に接続されています。
AfterUpdateRecord では、次のコードが実行されます (グループ内の多くの場所で見られるように、データベースへの投稿時にキーの変更が実際に伝播されます)。
次に、次のコードを使用してレコードを追加します。
ClientDataSet1.Refresh
の後に呼び出すとApplyUpdate
、基になる TIBCQuery が新しいキーではなく元のパラメータ -1 で再度開かれます...ClientDataSet1NO_INVOICE.AsInteger
レコードのマージ後に割り当てられた新しい値が表示されたとしても...ここで Refresh を使用するのはこの例を単純化してください... レコードを挿入し、更新を適用し、レコードを再度編集すると、問題が発生します。
オプションの使用法で何かを見逃していResolveToDataset
ますか、それとも新しいパラメーターでクエリを明示的に再開する必要がありますか?
ResolveToDataset = False
他のプロジェクトで使用する前に、この問題が発生したことはありません...
delphi - poFetchBlobsOnDemand の使用時に blob フィールドが既にフェッチされているかどうかを確認する正しい方法
複数のレコードを持つ TClientDataSet があり、すべてのレコードをロードする必要がありますが、一度に 1 つずつオンデマンドで BLOB フィールドをロードします。
FetchBlobs を 2 回呼び出すと BLOB が 2 回フェッチされ、フィールドの IsNull プロパティをチェックすると常に False が返されることに気付きました。
したがって、これまでに見つけた唯一の解決策は、Value や BlobSize などのプロパティにアクセスすることです。BLOB がフェッチされていない場合、「Blob はフェッチされていません」というメッセージとともに例外が EDBClient に発生するため、この例外が発生した場合は FetchBlobs を呼び出します。 .
これを行うためのより良い方法はありますか?
sql - ClientDataset.RefreshRecord は、結合されたテーブルに対して Delphi XE で機能しなくなりました - 回避策はありますか?
TClientDataset.RefreshRecord は、SQL ステートメントで結合されたテーブルを含むデータセットに接続された ClientDataset のレコードを更新しようとしたときに、SQL のテーブル結合部分を生成しなくなりました。
その結果、このメソッドを呼び出すと、メイン テーブルにない各フィールドに対してSQL エラー「列名が無効です」が発生します。
これは、Delphi 2010 以前では問題ではありませんでした。
このエラーは、TClientDataset に接続された DBX4 または BDE コンポーネントの両方で発生するため、TClientDataset コードの変更に問題がある可能性が高いです。
この問題を再現するには:
Delphi XE で 1 つのフォームのみを使用して新しいアプリを作成し、必要なデータベース コンポーネント(TSQLMonitor、TSQLConnection、TSQLQuery、TDatasetProvider、TClientDataset、TDatasource、および TDBGrid)をそのアプリにドロップして、それらを相互にバインドします。
テーブル結合を含む単純な SQL ステートメントを作成し、これを TSQLDataset.SQL プロパティに配置しました。
SQL ステートメントには、メイン テーブルのキー フィールドと、結合されたテーブルのフィールドの 2 つのフィールドだけが含まれていました。
これらのフィールドの両方を TSQLQuery と TClientDataset の両方に永続フィールドとして追加し、pfInKey を含むキー フィールドのプロバイダー フラグを指定します (どのフィールドがキーであるかがわからない場合、RefreshRecord は機能しないため、永続フィールドは必須です)。
フォームに 2 つのボタンを追加します。1 つは Clientdataset を開くだけで、2 番目のボタンは clientdataset.refreshrecord を呼び出します。
アプリを実行し、ボタンを押してデータセットとグリッド内のデータ表示を開きます。
[レコードの更新] ボタンを押すと、結合されたフィールドの SQL エラー "無効な列名" が表示されます。
アプリを閉じて SQLMonitor ログを開くと、Delphi が生成した更新レコード SQL ステートメントに、テーブル結合ステートメントが含まれていないことがわかります。
====
これを修正する方法についてのアイデアをいただければ幸いです。
delphi - Delphi: TClientDataset の範囲指定されたレコードだけを集計する方法は?
TClientdatasetを使用していくつかの集計を作成する必要があり ます。SQL では、これらの集計は次のようなスクリプトで実行できます。
非常に長いプロセスと非常に低速なネットワークでより高速にする必要があるため、 sql を使用する代わりにメモリ内集計を使用したいと考えています。私の考えは、次のような Expression を使用して ClientDataset に集計を追加することです。
Date_Column インデックスを作成し、次のように clientdataset をフィルター処理します。
この範囲の集計結果が表示されることを期待していましたが、残念ながら、集計は範囲を無視し、すべてのレコードの結果を出し続けます!
だから、私の質問は次のとおりです。TClientdatasetでこれをどのように達成できますか? または、範囲指定された集計をメモリ内で実行する方法が他にありませんか?
delphi - TClientDataSet がメモリを解放しない
特定のユーザーのセッションに固有の TSQLQuery、TDataSetProvider、および TClientDataSet を作成する DataSnap サーバーがあります。これらは、データベースからデータを取得し、TClientDataSet.Data (OleVariant) をクライアントに送信するために使用および再利用されます。1つの問題を除いて、非常にうまく機能します。
Open メソッドを呼び出して TClientDataSet を設定すると、割り当てられたメモリは、ユーザーがクライアントを DataSnap サーバーから切断するまで解放されません。ユーザーがアプリケーションを使用して DataSnap サーバーからデータを取得し続けると、メモリが引き続き割り当てられます (数百メガバイト)。ユーザーが切断すると、すべてのメモリが解放されます。長時間接続しているユーザーがすべての RAM を消費してサーバーをクラッシュさせないように、各要求の後に割り当てられたメモリを解放する必要があります。
ユーザーがデータを要求したときに TSQLQuery、TDataSetProvider、および TClientDataSet コンポーネントを作成し、各要求の後にすぐにそれらを破棄することがうまくいくと思いました。これは動作を変更しませんでした。RAM は引き続き割り当てられ、ユーザーが切断するまで解放されません。
TClientDataSet を使用すると、各要求の後でコンポーネントが破棄される場合でも、DataSnap サーバーが割り当てられたメモリを保持するのはなぜですか?
ありがとう、ジェームズ
<<< 編集 : 2011 年 7 月 7 日 18:23 >>>
Jeroen の推奨に従って、問題を再現する小さなプログラムを作成しました。サーバー (4 つのソース ファイル) とクライアント (4 つのソース ファイル) の 2 つの部分があります。このディスカッションにファイルを添付する機能がある場合、まだ使用できません。評価ポイントが不足しているため、以下にコードを貼り付けます。サーバーはサービスであるため、構築後に登録する必要があります (例: C:\ProjectFolder\Server.exe /install
)。
サーバーを構築する前に、SQLConnection1 のプロパティを設定し、ServerMethodsUnit1.pas の SQL ステートメントを編集します。メモリ割り当ての問題を確認する唯一の方法は、各リクエストでかなりの量のデータ (たとえば、500k) を取得することです。クエリを実行しているテーブルには、、、、、、、およびその他の列uniqueidentifier
が含まれます。すべてのデータベース データ型でメモリの問題が発生することを確認しました。クライアントに転送されるデータセットが大きいほど、サーバーはメモリを解放せずにすばやくメモリを割り当てます。varchar(255)
varchar(max)
nvarchar(max)
int
bit
datetime
両方のアプリがビルドされ、サービスが登録/開始されたら、ProcessExplorer を使用して、サーバー サービスによって使用されるメモリを表示します。次に、クライアントを起動し、[接続] をクリックし、ボタンをクリックしてデータを取得します。サーバーの ProcessExplorer のメモリが増加していることに注意してください。[切断] をクリックして、メモリがすべて解放されるのを確認します。
サーバー.dpr
ServerContainerUnit1.dfm
ServerContainerUnit1.pas
ServerMethodsUnit1.pas
クライアント.dpr
ClientUnit1.dfm
ClientUnit1.pas
ProxyMethods.pas
oracle - ADOのftBCDデータ型パラメータを持つOracleの数値列で「不特定のエラー」が発生する(Oracle Provider for OleDB)
ADO + DataSetProvider+ClientDataSetを使用してデルファイをプログラミングしています。ClientDataSetのApplyUpdatesでは、これにより、フィールドのデータ型に基づくパラメーターを使用してADOコマンドが生成されます。
パラメータがftBCDの場合、「不特定のエラー」が発生します。ftFloat、ftExtended、またはftCurrencyのデータ型を変更すると、コマンドは正常に実行されます。ただし、パラメータのデータ型はADO+ClientDataSetを使用して変更することはできません。使用されるプロバイダーは「OracleProviderforOleDB」です。
「MicrosoftプロバイダーOleDBfororacle」は問題なく実行されますが、非常に遅く、CLOB列に問題があります。オラクルは11gで、クライアントは11.2.0.2です。
DelphiはDelphiXEです。エラーのサンプルコード:
delphi - SQL Server 2008 で Delphi TClientDataSet の「読み取り専用フィールドを変更しようとしています」エラー、2000 で OK
Embarcadero® Delphi® 2010 バージョン 14.0.3593.25826
データベースを SQL Server 2000 から SQL Server 2008 に移動しようとしています。計算列を含む SELECT をロードする TClientDataSet があります。つまり、"SELECT Comp_Col = Column1 + ' ' + Column2..." です。
SQL Server 2000 データベースに対して実行すると、次のコードを使用して TClientDataSet の列の値を変更できます。
ただし、SQL Server 2008 データベースに対して実行すると、.Post() の実行時に「読み取り専用フィールドを変更しようとしています」というエラーが表示されます。
上記のコードで (.ReadOnly = false に加えて) 列に .ProviderFlags = '[]' を設定しようとしましたが、それでもエラーが発生します。IDE を介して設計時に .ReadOnly = false および .ProviderFlags = '[]' を設定しようとしましたが、これも役に立ちません。
SQL Server 2008 データベースに対して実行するときに TClientDataSet に計算列を設定する方法を知っている人はいますか?
ありがとう!
*更新:回答済み*
私は問題を発見しました-または少なくとも回避策...
TClientDataSetオブジェクトの列に.ReadOnly = false を設定していました。これは SQL Server 2000 では機能しましたが、SQL Server 2008 では機能しませんでした。
プロバイダーとして機能しているTADOQueryオブジェクトではなく列に .ReadOnly = false を設定すると、実行時に TClientDataSet オブジェクトの計算列の値を設定できます。
これは TClientDataSet オブジェクトの一般的な関数で実装されているため (プロバイダーについては何もしていません)、私にとっては理想的ではありませんが、今のところ実行する必要があります。
delphi - 「操作は適用されません」例外
私はdelphi6でアプリケーションを開発しています。
ClientDataSet (cds)、DataSetProvider (dsp)、および ds の DataSet が cds であり、cds の ProviderName が 'dsp' である DataSource (ds) があります。
特定の条件でレコードを CD に追加します。
CD のフィルターを設定して Filtered プロパティを True に設定した後、それを閉じようとすると、Filter プロパティをクリアして Filtered プロパティを false に設定しても、「操作は適用されません」というメッセージによって例外が発生します。
エラーなしで ClientDataSet を閉じるにはどうすればよいですか?
mysql - ClientDataSet による Delphi 2010 MySQL の更新が失敗する
Delphi 2010 を使用しており、dbexpress を使用して MySQL データベースに接続しています。接続は 100% 機能し、データを取得しています。問題は、dbGrid を介してデータを更新しようとしているときに発生します。テーブル内のすべてのエントリを調べて、チェックを実行しています。ApplyUpdates メソッドを呼び出すと、「レコードが見つからないか、別のユーザーによって変更されました」というメッセージが表示されました。
DataSetProvider の updateMode を upWhereKeyOnly に変更すると、「レコードが見つかりません。キーが指定されていません」というメッセージが表示される状況になりました。追加してみました
これをコードに追加しましたが、同じエラーが発生しています。ProviderFlags を SQLQuery に追加しようとしましたが、そのようなフィールド「idPolicy」がありません