将 NHibernate 与 SAP Advantage Database Server 12 结合使用

Using NHibernate with SAP Advantage Database Server 12

我目前正在尝试让 NHibernate 与 SAP 的 Advantage Database Server 12 一起工作。不幸的是,互联网上关于这个数据库服务器的信息不多,但在这种情况下,我必须使用它来访问现有的数据库。

所以我尝试先建立一个简单的测试项目,在 Student table 中添加 "Students",然后是:https://www.tutorialspoint.com/nhibernate/nhibernate_basic_orm.htm

关于ADS,我在这里找到了驱动程序和方言:https://groups.google.com/forum/#!topic/nhibernate-development/s7HLs-aEXDk

我设置了一个 table 和这个代码:

private void button1_Click(object sender, EventArgs e)
        {
            var cfg = new Configuration();
            cfg.DataBaseIntegration(x =>
            {
                x.ConnectionString = "data source=C:\Users\xxx\Downloads;ServerType=local; TableType=ADT; Shared=True; LockMode=COMPATIBLE";
                x.Driver<AdvantageDatabaseServerDriver>();
                x.Dialect<AdvantageDatabaseServer8Dialect>();
                x.LogSqlInConsole = true;
            });

            cfg.AddAssembly(Assembly.GetExecutingAssembly());
            var sefact = cfg.BuildSessionFactory();

            using (var session = sefact.OpenSession())
            {
                using (var tx = session.BeginTransaction())
                {
                    //perform database logic 
                    tx.Commit();
                }
                Console.ReadLine();
            }

            using (var session = sefact.OpenSession())
            {
                using (var tx = session.BeginTransaction())
                {
                    var student1 = new Students
                    {
                        ID = 1,
                        FirstMidName = "Allan",
                        LastName = "Bommer"
                    };

                    var student2 = new Students
                    {
                        ID = 2,
                        FirstMidName = "Jerry",
                        LastName = "Lewis"
                    };

                    session.Save(student1);
                    session.Save(student2);
                    tx.Commit();
                }
                Console.ReadLine();
            }
        }

但是它在第一次写入尝试时一直抛出这个异常:

NHibernate: INSERT INTO C:\Users\ad\Downloads\REFERENCE\Students.adt (LastName, FirstMidName) VALUES (?, ?); select NEWIDSTRING() from system.iota;p0 = 'Glenn' [Type: String (-1:0:0)], p1 = 'Allan' [Type: String (-1:0:0)]
Exception thrown: 'Advantage.Data.Provider.AdsException' in NHibernate.dll

是不是方言有问题?非常感谢任何帮助,谢谢!

从评论来看问题是这样的:

使用您正在使用的语法的 NHibernate 发出此代码:

INSERT INTO
  C:\Users\ad\Downloads\REFERENCE\Students.adt
(
    LastName
  , FirstMidName
)
VALUES
(
    ?
  , ?
);

select NEWIDSTRING() from system.iota;

显然,ADS 的 ASP.NET 驱动程序无法正确处理这种形式的参数传递。

您链接到的 knowledge base item 建议将 SQL 更改为使用命名参数:

INSERT INTO
  C:\Users\ad\Downloads\REFERENCE\Students.adt
(
    LastName
  , FirstMidName
)
VALUES
(
    :p0
  , :p1
);

select NEWIDSTRING() from system.iota;

我对 NHibernate 的了解还不够多,无法告诉您这是如何实现的。