Delphi の DBX(dbExpress) で TDataSetProvider と TSQLQuery 使ってたら EDBClient “Field value required” 例外が発生した

Delphi 2007 の DBX(dbExpress) で TDataSetProvider と TSQLQuery 使って DB2 にアクセスしていたのですが、DB の固定長列のデータを全部 Trim かけようとしたら、空の列(NOT NULL 制約付き)に対して Trim をかけた時点で EDBClient “Field value required” 例外が発生してしまいました。

DBX では TDataSetProvider の OnGetData イベントで DataSet をいじるのが基本なのですが、NOT NULL 制約は TSQLQuery で取得した列情報にすでに含まれているため、OnGetData イベント内の DataSet をいじっても制約が有効になって、先の例外を発生してしまうと言うことでした。

と言うことで、解決方法は2段階にしてみます。

最初は TSQLQuery の OnAfterOpen イベントで制約条件を外すことです。
続いて、TDataSetProvider の OnGetData イベントで Trim をかけることです。

サンプルソースはこんな感じ。

[code lang=’delphi’] procedure TFormDM.SQLQuery1AfterOpen(DataSet: TDataSet);
begin
DataSet.Fields[1].Required := False;
end;
[/code] FieldByName() でも問題ありません。
ここでは固定位置で指定しています。

[code lang=’delphi’] procedure TFormDM.DataSetProvider1GetData(Sender: TObject;
DataSet: TCustomClientDataSet);
begin
while not DataSet.Eof do begin
DataSet.Edit;
DataSet.Fields[1].AsString := Trim(DataSet.Fields[1].AsString);
DataSet.Next;
end;
end;
[/code] Trim() 実行のメインプログラム側。

この動作って、本来 Field 項目オブジェクトを静的に作っておけば OnGetText イベントで処理できるのですが、動的に SQL が切り替わるシステムに対応するため、上記のような2段階の作業が必要になっています。

BDE は空白を勝手に省くので、気にしなかった部分でした。

さらっと書きましたが、かなり調べるのに時間がかかりました。。

参考

Getting Started with dbExpress の TField properties automatically applied

10年集客し続けられるサイトを、ワードプレスで自作する9つのポイント プレゼント

【最後まで読んでくれたあなたに】

あなたは、24時間365日、自分の代わりに集客し続けてくれるWebサイトを作りたい!と思ったことはありませんか?

私はこれまで500以上のWebサイトの構築と運営のご相談に乗ってきましたが、Webサイトを作ってもうまく集客できない人には、ある一つの特徴があります。

それは、「先を見越してサイトを構築していないこと」です。
Webサイトで集客するためには、構築ではなく「どう運用するか」が重要です。

しかし、重要なポイントを知らずにサイトを自分で構築したり、業者に頼んで作ってもらってしまうと、あとから全く集客に向いていないサイトになっていたということがよく起こります。

そこで今回、期間限定で
『10年集客し続けられるサイトをワードプレスで自作する9つのポイント』
について、過去に相談に乗ってきた具体的な失敗事例と成功事例を元にしてお伝えします。

・ワードプレスを使いこなせるコツを知りたい!
・自分にピッタリのサーバーを撰びたい!
・無料ブログとの違いを知りたい!
・あとで悔しくならない初期設定をしておきたい!
・プラグイン選びの方法を知っておきたい!
・SEO対策をワードプレスで行うポイントを知りたい!
・自分でデザインできる方法を知りたい!

という方は今すぐ無料でダウンロードしてください。

期間限定で、無料公開しています。

※登録後に表示される利用条件に沿ってご利用ください

コメントを残す