2回使用されるパラメータを使用してクエリを実行しようとすると、ORA-01008「すべての変数がバインドされていません」というメッセージが表示されます。ただし、このパラメーターを含むコードをクエリの最後に配置すると、正常に機能します。
エラーを再現する簡単なプログラム
internal static class Program {
private static void Main() {
//this query does not work
ExecuteSql(@"select
category1_.ID as ID0_,
category1_.ValidUntil as ValidUntil0_
from
Invoice invoice0_,
Category category1_
where
( invoice0_.Foo<:p0 or invoice0_.Foo>:p0 )
and category1_.ValidUntil=:p1");
//this works
ExecuteSql(@"select
category1_.ID as ID0_,
category1_.ValidUntil as ValidUntil0_
from
Invoice invoice0_,
Category category1_
where
category1_.ValidUntil=:p1
and ( invoice0_.Foo<:p0 or invoice0_.Foo>:p0)");
}
private static void ExecuteSql(string commandText) {
Console.WriteLine("------");
try {
var cs = "User ID=nhibernate;Password=nhibernate;Data Source=192.168.0.101:1521";
using (var connection = new OracleConnection(cs))
using (var cmd = connection.CreateCommand()) {
cmd.BindByName = true; // I want to bind parameters by name
cmd.CommandType = CommandType.Text;
cmd.CommandText = commandText;
cmd.Parameters.Add(":p0", OracleDbType.Int32, 42, ParameterDirection.Input);
cmd.Parameters.Add(":p1", OracleDbType.TimeStamp, DateTime.Now, ParameterDirection.Input);
connection.Open();
cmd.ExecuteReader();
}
}
catch (Exception e) { Console.WriteLine(e); }
}
}
フルマネージドのODP.NETを使用しています
DbはOracleXE11gRelease2です