注意:我特别不使用 Fluent NHibernate,而是使用 3.x 的内置映射样式。但是,当我认为应该返回记录时,我得到了一个空白记录集。
我确定我做错了什么,它把我逼到了墙角。:)
背景/设置
- 我有一个名为 Maximo 的 IBM 产品的 Oracle 11g 数据库
- 该产品有一个名为 workorder 的表格,其中列出了工作订单;该表有一个名为“wonum”的字段,它代表一个唯一的工作订单号。
- 我有一个“报告”用户,可以通过 maximo 模式访问表
- 例如“从 maximo.workorder 中选择 *”
- 我正在使用 Oracle 的托管 ODP.NET DLL 来完成数据任务,并且是第一次使用它。
我尝试过的事情
- 我创建了一个基本的控制台应用程序来测试它
- 我在主分支上添加了 NHibernate.Driver 中的 OracleManagedClientDriver.cs(我正在使用的版本中没有正式发布)。
- 我创建了一个名为 WorkorderBriefBrief 的 POCO,它只有一个 WorkorderNumber 字段。
- 我创建了一个类映射 WorkorderBriefBriefMap,它只将该值映射为只读值。
- 我创建了一个带有控制台输出的控制台应用程序来尝试编写工单行。
- 会话和事务似乎正确打开,
- 我测试了一个标准 ODP.NET OracleConnection 到我的连接字符串
编码
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 个工单编号。对我来说,这表明我对 NHibernate 的使用比 Oracle Managed ODP.NET 更多。所以我希望这只是我在上面的映射或配置中所做的一些愚蠢的事情。
// 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();