[seasar-dotnet:258] Re: [S2Dao]SQLServerのバインド変数コメントでエラー

Ryo Miyagi rmiyax @ yahoo.co.jp
2006年 6月 29日 (木) 00:53:04 JST


宮城です。

> 今週リリース予定の次バージョンでは、バインド変数コメントを重複して
> 使用できるように対応したいと思います。

上記の修正が原因だと思うのですが、
重複したバインド変数コメントを含むSQLファイル
(例:"select * from emp where empno = @empno or empno = @empno or ename = @ename")
をOracle(ODP.NET Ver 10.2.0.100)に対して実行すると

ORA-01008: バインドされていない変数があります。

のエラーが発生します。

また、ODBC経由でも同様のエラーが発生します。

※但し、テストケースにある
  select * from emp where empno = @empno or empno = @empno2 or empno = @empno
  のSQLだとODP.NETでは成功する。ODBCでは失敗する。

位置指定パラメータをサポートしているデータプロバイダのみで
エラーになっていることから、
位置指定パラメータを指定する必要があるところに
名前付パラメータとしてパラメータをセットするように修正したことが原因だと思われます。

そこで私のほうで次のように修正したいと考えています。

(1) S2ADO.NETの内部処理では位置指定パラメータを使用する。
    理由:S2ADO.NETの移植元であるS2JDBCが使用しているJDBCドライバは、
          位置指定パラメータをサポートしているため、
          S2ADO.NETも内部の動きは同じ位置指定パラメータにしていたほうが
          互換性をとりやすい。

(2) データプロバイダに渡すパラメータ名はS2ADO.NET内部で生成する。
    従って、パラメータ名の重複は無くなる。
    例:
    ユーザがプログラムで指定するSQL文:
        SELECT * FROM EMP WHERE empno = @empno OR EMPNO = @empno2 OR empno = @empno
    S2ADO.NETがデータプロバイダ(SQL Server)に渡すSQL文:
        SELECT * FROM EMP WHERE empno = @1 OR EMPNO = @2 OR empno = @3
    S2ADO.NETがデータプロバイダ(ODP.NET)に渡すSQL文:
        SELECT * FROM EMP WHERE empno = :1 OR EMPNO = :2 OR empno = :3
    S2ADO.NETがデータプロバイダ(ODBC)に渡すSQL文:
        SELECT * FROM EMP WHERE empno = ? OR EMPNO = ? OR empno = ?

(3) (2)の修正に伴い、次のメソッドを廃止(obsole)する。
    メソッドの呼び出し元からパラメータ名(argNames)を指定しても使用しないので引数に必要ない。
    パラメータのデータ型(argTypes)もパラメータ(args)から推測できるので必要ない?。
    Seasar.Extension.ADO.Impl.BasicSelectHandler.Execute(
        object[] args, Type[] argTypes, string[] argNames)
    →今後は、Seasar.Extension.ADO.Impl.BasicSelectHandler.Execute(object[] args)を使用。
    Seasar.Extension.ADO.Impl.BasicUpdateHandler.Execute(
        object[] args, Type[] argTypes, string[] argNames)
    →今後は、Seasar.Extension.ADO.Impl.BasicUpdateHandler.Execute(object[] args)を使用。

以上、特に問題が無いようでしたら週末に修正したいと考えています。


--------------------------------------
Let's start Yahoo! Auction  -  Free Campaign Now!
http://pr.mail.yahoo.co.jp/auction/


seasar-dotnet メーリングリストの案内