問題タブ [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 - 「パラメーターの値がありません」エラー メッセージ
私はDelphi7が初めてです。
TClientDataSet オブジェクトでエディターの [すべてのフィールドを追加] 機能を使用しようとすると、メッセージ ボックス (従来のエラー メッセージ ボックス) が表示され、「パラメーター '(パラメーターの名前)' の値がありません」というメッセージが表示されます。
「すべてのフィールド」機能を使用してフィールドを追加できなくなりました。
「パラメーターの値がありません」エラーの原因を見つけるにはどうすればよいですか?
delphi - 別の DataSetProvider で ClientDataSet.AppyUpdates を使用するマスター/詳細
各 CDS の DataSetProvider とのマスター/詳細関係に 2 つの ClientDataSet を使用します。マスターと詳細の関係に対してメモリ内フィルタリングを行うため、詳細にはネストされた CDS を使用しません。
私が抱えている問題は、基礎となるデータベース (firebird) に変更を適用する必要がある場合です。詳細 INSERT の場合は最初にマスターを適用する必要があり、詳細 DELETE の場合は最初に詳細を適用する必要があります (データベースのマスターと詳細の関係に違反することなく)。ここまでは順調ですね。しかし、詳細 CDS に INSERT と DELETE が混在している場合はどうすればよいでしょうか? その後、マスター CDS の前後に適用できません。
ネストされた CDS を使用せずに、このような状況をどのように処理できますか?
delphi - BIGINT(TLargeintField)であるTClientDataSetの集計フィールドを使用するにはどうすればよいですか?
フィールドの最大値を計算する必要がありますが、計算に問題があります。私のフィールドの名前が「VALUE0」だとします。TClientDataSetの集計関数を使用してこれを行いたいと思います。私は何をすべきか?
このコードは、SQLテーブルのBIGINTであるフィールドでのみ失敗します。
「cds.Open」行でこの例外が発生します。
編集
コメントで要求されているように、VALUE0のフィールドのクラス名はTLargeintFieldであり、FieldKindはfkDataです。
編集2
問題はTClientDataSet集計関数のBIGINTとINTEGERに関するものであることがわかったため、質問とテキストの一部を変更しました。
delphi - TClientDataSet と StatusFilter を使用したレコードの処理
TClientDataSet
プロバイダーの概念を持たないローカル データセットとしてを使用しています。それを操作した後、変更を解決するために を使用して対応する SQL ステートメントを生成するメソッドが呼び出されStatusFilter
ます (基本的に SQL を生成します)。
ドキュメントを読んだ後、これは最初は簡単に見えました ( set StatusFilter to [dsInsert]
、すべての挿入 SQL をStatusFilter to [dsModified]
処理し、すべての更新を処理し、削除と同じように設定します)。
レコードを追加した場合は、それを編集します。設定するとStatusFilter to [dsInserted]
表示されますが、元のデータが表示されます。
レコードを追加し、編集してから削除すると、レコードStatusFilter set to [dsInserted] and [dsModified]
も表示されます。
そして他の同様の状況..
1)最初にすべての挿入を処理し、次にすべての更新を処理してからすべての削除を行うと、データベースが正しい状態で更新されることはわかっていますが、このアプローチは正しくないように見えます(役に立たないSQLステートメントを生成します)。
2)PRecInfo(ClientDataSet.ActiveBuffer + ClientDataSet.RecordSize).Attribute
情報 (dsRecNew、dsRecOrg など) にアクセスしようとしましたが、まだロジックを解決できません。
3)それを解決するためのロジックをプログラムできます。たとえばStatusFilter to [dsDeleted]
、レコードがその後削除されたかどうかを確認するために、処理して挿入、設定、および主キーで検索する前に..編集と同じで、挿入する前に、レコードがあったかどうかを確認します後で更新されたので、更新されたバージョンの挿入SQLなど..しかし、それはより簡単なはずです..
¿誰かがこれをエレガントで簡単な方法で解決しようとしましたか? 何か足りない?ありがとう
delphi - DelphiTClientDataSet問題の特定
Delphi7
、MS Vista
およびDevart's dbExpress
ドライバー(バージョン4.70)を使用しています。TSQLConnection
a 、a TSQLTable
(tabA
)、a TDataSetProvider
、a TClientDataSet
(cdsA
) 、a DataSource
、 aをドロップしDBGrid
ます。
グラフィックデザインツールですべての設定を行いました。開くと、すべてが正常にcdsA
機能し、グリッド内のすべてのデータを確認できます。これが私のコードです:
fieldA
テーブルにfieldB
存在し、で定義されていcdsA.Fields
ます。このコードを実行すると、Locate
命令は例外を生成しますEVariantInvalidArgError ... Invalid argument
。何が悪いのかしら。TIA。
フランチェスコ
sql-server - ブリーフケース モデルを使用したローカル TClientDataSet の主キー
DataSnap クライアント アプリが DataSnap サーバーのリモート データ モジュールに接続してTDataSetProvider
+を使用するTClientDataSet
と、クライアント アプリのローカルに db テーブル (またはビュー) がキャッシュされます。ユーザーは、TClientDataSet 内のデータをローカルでApplyUpdates(0)
変更し、その変更をサーバーと同期できます。これはすべて理にかなっています。
SQL Server 2008 データベースを使用すると、主キーはフィールドidentity
またはGUID
フィールドのいずれかになります。local に新しいレコードを追加している間、ユーザーがオフラインになると仮定すると、ユーザーが新しいレコードを作成するときに、 localおよびは主キー フィールドの割り当てをTClientDataSet
どのように処理するのでしょうか? ローカルで作成されたレコードはマスター/詳細関係の一部である可能性があるため、新しい主キーをローカルで作成する必要があるのは当然のことです。ユーザーが「ApplyUpdates(0)」を実行すると、どのように解決されますか?TDataSetProvider
TClientDataSet
複数のユーザーがオフラインモードでレコードを作成する場合、それぞれがApplyUpdates(0)
?
フィールドはidentity
フィールドよりも優れていGUID
ますか、それともその逆ですか? なんで?
delphi - Reconcile Error: エラー メッセージが切り詰められて問題が発生した人はいますか?
私はあなたに助けを求めるために再びここにいます。今回は、私がお話しする問題が非常に特殊であることを考えると、反応する人はほとんどいないと思います。私は DataSnap の世界から始めていますが、このエラーがどのように関係するのかまだ理解していません。
私の Delphi は XE (バージョン 1、Update1) です。ポルトガル語 (ポルトガル語ブラジル) でエラー メッセージを生成する Postgres を使用しています。このため、エラー メッセージにはアクセントがあります。接続コンポーネントは ZeosLib パッケージです。
ダイアログボックス「調整エラー」を使用して、更新の適用から発生したエラーを表示し、テストします。すでに存在するレコードを挿入しようとしたため、一意のキーに違反し、調整エラーダイアログが表示されました。
ダイアログのメモでは、表示されるメッセージが切り捨てられます。つまり、カットされます。見てみな:
しかし、実際に返されるべきものはこれです:
問題が ZeosLib にあるかどうかを確認するためにサーバーでデバッグを実行しましたが、サーバーで生成されたエラー メッセージが完全であることがわかり、ZeosLib がメッセージを切り捨てていないことが証明されました。すべてユニコードです。私のプログラムと ZeosLib の両方で、すべての文字列は WideString (デフォルト) です。
ご存知のように、サーバーでスローされる例外は、大まかに言えば、DataSnap によってクライアントに転送され、クライアントでは、TClientDataSet の Reconcile メソッドが問題があるかどうかを確認してから、有名な例外 EReconcileError をスローします。 TClientDataSet の OnReconcileError イベントで処理されるため、メッセージは DataSnap によって切り詰められていると思います。
クライアントで Reconcile メソッド (DBClient.pas) をデバッグし、例外がスローされる直前に、ライブラリ midas.dll、より具体的には MidasLib.obj の一部と思われる cpp ソース コード内の関数に入ります。この戦略を使用すると、アプリケーションで DLL を配布する必要がなくなります。
この呼び出しは、Delphi XE Update1 のユニット DBClient.pas の 1952 行で行われます。F7 を押すと、デバッガーはソース C++ (cpp) に入るため、midaslib.obj 内にあると思います。C++ をよく理解していないので、Shift-F8 を押して現在のメソッドを終了し、次の命令を返します。これは、既にイベント OnReconcileError 内にあります!! したがって、切り捨ては、前述の関数内、cpp ソース内、midaslib 内で行う必要があります。
私の意図は、Reconcile Error ダイアログを、最終的なユーザーだけでなく、エラー、詳細、およびコンテキストの情報を個別に提供する個人をサポートするツールにすることです。これは、問題を発見するのに大いに役立ちます。
ここでの問題は、メッセージを完全に表示することです。midas によってメッセージが切り捨てられるというこの種の問題が発生した人はいますか?
また、DSClient.pas の別のポイントは、例外に渡されるときにエラー メッセージを抽出できます。
引用符を削除し、#$A (1 文字) を空白 (1 文字) に置き換えると、文字列が正確に 255 文字であることがわかります!!
また、dspickle.cpp の "GetErrorString" が、bdetypes.h で 127 (255 の半分) として定義されている定数 DBIMAXMSGLEN を使用していることも発見しました。私たちは Unicode の世界にいるので、1 文字あたり 2 バイトにするために、この値を 255 に増やすことは問題ではないでしょうか? これは推測にすぎません...
私は C++ を理解する知識が不足しているため、質問は保留にします :) dspickle.cpp の関数実装 "GetErrorString" を見てください。これがあります:
pString はエラー メッセージで、DBIMAXMSGLEN = 127 です。
delphi - Delphi TClientDataSet、インデックスごとのフィールドの最大数
TDataSetを指定した単純なDelphi(2007)プロシージャがあり、フィールドの(サブ)リストは、指定されたTDataSetとは異なる値を持つ新しいTClientDataSetを返します。
これは非常にうまく機能します。
私のprocでは、TClientDataSetインデックスを使用して個別の値を設定しました。速くて簡単でした。
問題は、TClientDataSetインデックスが最大16フィールドをサポートすることです。それらをさらに追加すると、それらは黙って無視されます。
データセット(したがってインデックス)に16を超えるフィールドが必要です。
解決策はありますか?いくつかのハック?回避策として使用するオープンソースライブラリがあるのではないでしょうか。
私はオフラインで作業しているので、メモリ内で実行する必要があります。データセットのサイズは大きくありません
delphi - Delphiでは、列が欠落している行を挿入できませんが、それらのフィールドのトリガーとジェネレーターを使用できます
問題は単純です。Firebird2.1.4データベースにトリガーとジェネレーターがあり、挿入ごとに列を自動インクリメントします。
システムのアーキテクチャは次のとおりです。
ただし、列が欠落しているTClientDataSetに更新を投稿しようとすると、Delphiは次のように文句を言います。
これらのフィールドが欠落しているSQL挿入ステートメントを使用すると、行が挿入され、トリガーとジェネレーターが期待どおりに機能します。
Delphi(DBX、DataSnapなど)に自分がやろうとしていることを理解させる(そして許可する)にはどうすればよいですか?
編集
@ mj2008のコメントに基づいて詳細情報を提供します。このTClientDataSetは、CloneCursorメソッドを使用して実行時に作成されます。CloneCursorを呼び出した後、このフィールドのRequiredプロパティをFalseに設定しました。この問題には役立ちません。例:
これにより、同じ例外がスローされます。
delphi - プロパティ Required が false に設定されているフィールドから情報を取得する方法は?
ソフトウェアに次の DBX 構造があります。
TClientDataSet のフィールドの 1 つで、Required プロパティが false に設定されています。これは、このフィールドがデータベース (Firebird) のトリガーとジェネレーターに基づいて自動インクリメントするためです。
しかし、TSQLDataSet と TClientDataSet の両方をこのフィールドが必須でないように構成した後、TClientDataSet からこのフィールドを読み取ろうとすると、非常に奇妙な結果が得られます。この状態で TClientDataSet にこのフィールドの値を強制的に取得させるには、何か特別なことをする必要があるのではないかと思います。
ここで何が欠けていますか?
前もって感謝します。
編集
Required プロパティのヘルプ ファイルには、これについての記述がありますが、何をしたいのかよくわかりませんでした。
説明
フィールドに空白以外の値が必要かどうかを指定します。
Required を使用して、フィールドに値が必要かどうか、またはフィールドを空白にすることができるかどうかを調べます。
フィールド エディターでフィールドが作成された場合、このプロパティは基になるテーブルに基づいて設定されます。値が必要なフィールド (パスワードや部品番号など) に対して Required を true に設定するが、基になるテーブルでフィールドが必要とされないアプリケーションは、プロパティを適用するために OnValidate イベント ハンドラーを作成する必要があります。
Required プロパティが基になるデータベース テーブルのプロパティを反映している場合、null 値をポスト適用しようとすると、例外が発生します。基になるテーブルがフィールドを必要としない場合に Required プロパティを true に設定するアプリケーションは、同じ結果を得るために、OnValidate イベント ハンドラーで null 値に対して EDatabaseError 例外を発生させる必要があります。
編集2
言い忘れましたが、TDataSetProvider と TClientDataSet の間には DataSnap 層があります (TClientDataSet 接続は DataSnap ドライバで行われます)。
編集3
この DataSnap セットアップで小さなテスト ケースを作成したところ、完全に機能しました。このプロジェクトはレガシーで乱雑で、私を悩ませているどこかであいまいなオプションを構成しているか、DataSnap のバグに遭遇したかのいずれかだと思います。