[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 メーリングリストの案内