将 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 的了解还不够多,无法告诉您这是如何实现的。
我目前正在尝试让 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 的了解还不够多,无法告诉您这是如何实现的。