[DAONET-73] InterBaseとBDPの組み合わせで、カラム名にFROMが含まれるとレコードの取得に失敗する Created: 2007-12-26  Updated: 2008-02-04  Resolved: 2008-02-04

Status: Closed
Project: S2Dao.NET
Component/s: S2Dao.NET
Affects Version/s: 1.3.5
Fix Version/s: None

Type: Bug Priority: Major
Reporter: Mitsuhiro Koba Assignee: rmiyax
Resolution: Won't Fix Votes: 0
Labels: None
Environment:

InterBase 2007
BDP2.5.0.1(Borland Data Provider)
Microsoft Visual Studio 2005 VB.NET


Attachments: File DB.zip     Text File Program.vb     File S2DaoSample.zip     File SAMPLEDEMO_2.zip    

 Description   

InterBaseとBDPの組み合わせで、カラム名に"FROM"が含まれると、エンティティの全メンバが型に応じて
Nothing(String型)、0(Long型)、False(Boolean)等の値が入り正しい値が取得できません

以下の組み合わせだと問題はありません
■InterBaseとBDPの組み合わせで、カラム名を"FRO"に変更
■BDPではなくDataDirect ODBC経由で接続する
■S2Dao.NETを使用せずBDPとADOで直接アクセスした場合は正しい値が取得できる

ODBCを使用することで問題の回避はできるのですが、原因がわかれば幸いに思います。



 Comments   
Comment by rmiyax [ 2008-02-04 ]

クローズということで了解しました。

また、何かありましたらご連絡ください。

Comment by Mitsuhiro Koba [ 2008-02-04 ]

ありがとうございます。
BDP2.5.0.1で実行した場合は、Insert処理は正常に動作致します。

元々のバグに関しては、BDP2.5.0.1が.Net2.0に未対応ということで、ODBCで
回避出来ますので、本件に関しては終了でよいかと思います。

新しいバージョンに関しては、公開されたタイミングで試してみます。

Comment by rmiyax [ 2008-02-01 ]

最新版のBDPではなく
BDP2.5.0.1で実行した場合、どうなりますか。

私の環境のBDP2.5.0.1で実行すると、
parameter.DbTypeにStringが入っており、
Insert処理が正常に完了しました。

Comment by Anonymous [ 2008-01-21 ]

ご返信ありがとうございます。

該当するカラムのDBParameterクラスのDbType、ParameterName、Valueプロパティの値は
以下です。
DbType:Object        System.Data.DbType
ParameterName :"@2"   string
Value:"aa"            object

{string}

DbTypeが何故かStringではなくObjectになっていました。

デバッガでおいかけたところ以下でdbTypeにはString(System.Data.DbType.String)
型が入っているのですが、parameter.DbTypeはObjectが入っていました。
Seasar.Extension.ADO.Types\BaseValueType.cs
67: parameter.DbType = dbType;

>BDPでは、パラメータ名の指定に"?"を使えるか確認してもらえませんか。
上記に関しましては、問いあわせ中です。
何か情報が入りましたらまた記述させて頂きます。

以上宜しくお願いいたします。

Comment by rmiyax [ 2008-01-19 ]

Insert SQL文とDBパラメータの指定で問題が発生しているかもしれません。

S2Dao.NETでは、SQL文を実行する場合に、
Seasar.Framework.Util.CommandUtilクラスの
ExecuteNonQueryメソッド、ExecuteScalarメソッドを経由して
System.Data.IDbCommandクラスを叩いています。

上記のメソッドにブレークポイントを設定して
System.Data.IDbCommandクラスのParametersプロパティに格納された
DbParameter クラスの
DbTypeプロパティのDB型と
ParameterName プロパティのパラメータ名と
Valueプロパティのパラメータ値を確認してもらえますか。

おそらくParameterName プロパティのパラメータ名は、"?"になっていると思います。
BDPでは、パラメータ名の指定に"?"を使えるか確認してもらえませんか。

Comment by Mitsuhiro Koba [ 2008-01-18 ]

本件ですが、使用していたBDPが.Netの2.0に対応していないことが原因であったようです。
提供頂いたBDPの最新版を使用した場合、カラム名にFROMが入っていても正常に動作しました。
※最新版に関しては、日本のWebにてユーザ向けにダウンロード公開予定とのことです。

ここに書くべきではないのかもしれませんが、最新版で、Insert時にカラムが文字列型
(VARCHAR、CAHR)になると内部エラーが発生するという現象で悩んでおります。
INTEGER型では内部エラーは発生しません。

[ESSR0071]SQLで例外が発生しました。理由はBorland.Data.TAdoDbxException: internal error

またS2Dao.Netを介さない場合には問題なくInsert出来ることから、本件のGetSchemaTable
のようなS2Dao.NETの仕様に関連している部分で問題が発生しているものと考えています。
ソースのこの部分を参照等でも結構ですので、情報がありましたら御教授お願いします。

Comment by Mitsuhiro Koba [ 2007-12-28 ]

添付されたProgram.vbで再現することを確認いたしました。
※出先なので同一の環境ではないのですが。

S2Dao.Netの問題ではないようですね。
CodeGearのサイトよりバグ報告もできるようですが、英語のみのようで厳しいです。
休み明けに担当者を通じて問い合わせを行ってみることと致します。

>S2Dao.NET経由で"SELECT"のSQL文を発行した場合、
>BdpDataReaderクラスのGetSchemaTableメソッドから取得したDBテーブルのメタ情報にあるカラム名と
>エンティティのプロパティ名のマッピングを行って値を設定します。

上記のような仕組みになっているのですね。
少しソースを眺めて勉強いたします。

ありがとうございました。

Comment by rmiyax [ 2007-12-28 ]

"TESTFROM"(TESTとFROMの間にスペースがない)の場合にこちらの環境でも再現しました。

原因は、Borland.Data.Provider.BdpDataReaderクラスのGetSchemaTableメソッドが
DBテーブルのメタ情報を返さないことにあります。
おそらく、Borland Data Providerの不具合だと思います。

S2Dao.NET経由で"SELECT"のSQL文を発行した場合、
BdpDataReaderクラスのGetSchemaTableメソッドから取得したDBテーブルのメタ情報にあるカラム名と
エンティティのプロパティ名のマッピングを行って値を設定します。
従って、GetSchemaTableメソッドの戻り値が空の場合、マッピングが行われないため
エンティティの全プロパティが未設定になります。

検証ソースファイルを添付しましたので、
そちらの環境で再現するか確認をお願いいたします。

Comment by Mitsuhiro Koba [ 2007-12-28 ]

rmiyaさんに頂いたDBファイルでは正常に取得できました。

前回のコメントですが、TestとFROMの間にスペースが入っておりました。
Wikiのeffect?を使った際に誤ったようです。大変申し訳ありません。

TestとFromの間にスペースがない場合にはどうなりますでしょうか。
こちらの環境では、現象が発生しております。

現象が発生するDBファイルを添付いたします。

宜しくお願いいたします。

Comment by rmiyax [ 2007-12-28 ]

サンプルソースの確認結果です。

>InterBaseとBDPの組み合わせで、カラム名に"FROM"が含まれると、エンティティの全メンバが型に応じて
>Nothing(String型)、0(Long型)、False(Boolean)等の値が入り正しい値が取得できません

エンティティの全プロパティが正しい値を取得できない現象は発生しません。

"FROM"を含むカラム名に対応したエンティティのプロパティに値がセットされない現象は発生しました。
これは、S2Dao.NETの正常な動作になります。
S2Dao.NETでは、DBのカラム名とエンティティのプロパティのマッピングする際、
カラム名に含まれる "_"(アンダースコア)を除去してマッピングします。
例えば、
"TESTFROM " のカラム名は、"TestFrom"プロパティに、
"TEST_FROM " のカラム名は、"TestFrom"プロパティに
マッピングされます。
しかし、カラム名に" "(スペース)を含む"TEST FROM " のカラム名は、"TestFrom"プロパティにマッピングしません。
よって、S2Dao.NETの仕様ではカラム名に" "(スペース)を含むカラムに対するマッピングに対応していません。

ただ、ODBC経由だと正しい値が取得できる理由が不明です。
DBの作成方法(文字コード等)が原因かもしれないので
こちらで作成したInterBaseのDBファイルとAdo.diconを添付しますので
Mitsuhiro Koba さんの環境で確認していただけないでしょうか。

Comment by Mitsuhiro Koba [ 2007-12-27 ]

ありがとうございます。
ソースをプロジェクトごと添付させて頂きます。
(BDPのDLLは外しております。参照設定等の変更が必要です。)

■スキーマ
/* Table: TEST, Owner: SYSDBA */
CREATE TABLE "TEST"
(
"ITEM1" INTEGER NOT NULL,
"ITEM2" BOOLEAN NOT NULL,
"ITEM3" VARCHAR(10),
"TEST FROM " INTEGER NOT NULL,
PRIMARY KEY ("ITEM1")
);
※TEST FROM をTESTFRO に変更すると正常な値が取得できます。

■データ
ITEM1 ITEM2 ITEM3 TESTFROM
===== ===== ========== ========
1 True test 2

■動作環境の補足
OS:XPPro、Vista
C#では試しておりません。

以上宜しくお願いいたします。

Comment by rmiyax [ 2007-12-27 ]

InterBase 2007 + BDP2.5.0.1 + C# の環境で確認しましたが再現しませんでした。

再現可能なソースファイルおよびデータファイルがあれば
送付していただけないでしょうか。

Generated at Mon Dec 15 17:57:43 JST 2025 using Jira 10.6.1#10060001-sha1:a6461e220f274b29ced7ac9295492f2465fe5ef5.