注:私は特にFluent NHibernateを使用していませんが、3.xの組み込みのマッピングスタイルを使用しています。ただし、レコードを返す必要があると思うときに、空白のレコードセットを取得しています。
私は何か間違ったことをしていると確信しており、それが私を壁に押し上げています。:)
背景/セットアップ
- MaximoというIBMの製品用のOracle11gデータベースがあります。
- この製品には、作業指示をリストする作業指示と呼ばれるテーブルがあります。そのテーブルには、一意の作業指示番号を表す「wonum」というフィールドがあります。
- maximoスキーマを介してテーブルにアクセスできる「レポート」ユーザーがいます
- 例:「select * frommaximo.workorder」
- OracleのManagedODP.NETDLLを使用してデータタスクを実行し、初めて使用しています。
私が試したこと
- これをテストするための基本的なコンソールアプリケーションを作成しました
- マスターブランチのNHibernate.DriverからOracleManagedClientDriver.csを追加しました(使用しているリリースには正式には含まれていません)。
- WorkorderBriefBriefというPOCOを作成しました。これには、WorkorderNumberフィールドしかありません。
- その値のみを読み取り専用値としてマップするクラスマップWorkorderBriefBriefMapを作成しました。
- 作業指示書の行を書き込もうとするコンソール出力を備えたコンソールアプリケーションを作成しました。
- セッションとトランザクションは正しく開いているように見えますが、
- 接続文字列に対して標準のODP.NETOracleConnectionをテストしました
コード
POCO:WorkorderBriefBrief.cs
namespace PEApps.Model.WorkorderQuery
{
public class WorkorderBriefBrief
{
public virtual string WorkorderNumber { get; set; }
}
}
マッピング:WorkorderBriefBriefMap.cs
using NHibernate.Mapping.ByCode;
using NHibernate.Mapping.ByCode.Conformist;
using PEApps.Model.WorkorderQuery;
namespace ConsoleTests
{
public class WorkorderBriefBriefMap : ClassMapping<WorkorderBriefBrief>
{
public WorkorderBriefBriefMap()
{
Schema("MAXIMO");
Table("WORKORDER");
Property(x=>x.WorkorderNumber, m =>
{
m.Access(Accessor.ReadOnly);
m.Column("WONUM");
});
}
}
}
まとめる:Program.cs
namespace ConsoleTests
{
class Program
{
static void Main(string[] args)
{
NHibernateProfiler.Initialize();
try
{
var cfg = new Configuration();
cfg
.DataBaseIntegration(db =>
{
db.ConnectionString = "[Redacted]";
db.Dialect<Oracle10gDialect>();
db.Driver<OracleManagedDataClientDriver>();
db.KeywordsAutoImport = Hbm2DDLKeyWords.AutoQuote;
db.BatchSize = 500;
db.LogSqlInConsole = true;
})
.AddAssembly(typeof(WorkorderBriefBriefMap).Assembly)
.SessionFactory().GenerateStatistics();
var factory = cfg.BuildSessionFactory();
List<WorkorderBriefBrief> query;
using (var session = factory.OpenSession())
{
Console.WriteLine("session opened");
Console.ReadLine();
using (var transaction = session.BeginTransaction())
{
Console.WriteLine("transaction opened");
Console.ReadLine();
query =
(from workorderbriefbrief in session.Query<WorkorderBriefBrief>() select workorderbriefbrief)
.ToList();
transaction.Commit();
Console.WriteLine("Transaction Committed");
}
}
Console.WriteLine("result length is {0}", query.Count);
Console.WriteLine("about to write WOs");
foreach (WorkorderBriefBrief wo in query)
{
Console.WriteLine("{0}", wo.WorkorderNumber);
}
Console.WriteLine("DONE!");
Console.ReadLine();
// Test a standard connection below
string constr = "[Redacted]";
OracleConnection con = new OracleConnection(constr);
con.Open();
Console.WriteLine("Connected to Oracle Database {0}, {1}", con.ServerVersion, con.DatabaseName.ToString());
con.Dispose();
Console.WriteLine("Press RETURN to exit.");
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine("Error : {0}", ex);
Console.ReadLine();
}
}
}
}
あなたが与えることができるどんな助けにも前もって感謝します!
アップデート
次のコード(OracleDataReaderを使用する標準のADO.NET)は正常に機能し、必要な16個の作業指示番号を返します。私にとって、これはOracleManagedODP.NETよりもNHibernateを使用していることを示しています。ですから、上記のマッピングまたは構成で行ったのはばかげたことだと思います。
// Test a standard connection below
string constr = "[Redacted]";
OracleConnection con = new Oracle.ManagedDataAccess.Client.OracleConnection(constr);
con.Open();
Console.WriteLine("Connected to Oracle Database {0}, {1}", con.ServerVersion, con.DatabaseName);
var cmd = new OracleCommand();
cmd.Connection = con;
cmd.CommandText = "select wonum from maximo.workorder where upper(reportedby) = 'MAXADMIN'";
cmd.CommandType = CommandType.Text;
Oracle.ManagedDataAccess.Client.OracleDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader.GetString(0));
}
con.Dispose();