Использование NHibernate с сервером баз данных SAP Advantage 12 - PullRequest
0 голосов
/ 01 декабря 2018

В настоящее время я пытаюсь заставить NHibernate работать с SAP Advantage Database Server 12. К сожалению, в Интернете мало информации об этом сервере баз данных, но в этом случае мне нужно использовать его для доступа к существующей базе данных.

Поэтому я попытался сначала создать простой тестовый проект, который добавляет «Студенты» в таблицу «Студент», а затем: https://www.tutorialspoint.com/nhibernate/nhibernate_basic_orm.htm

Что касается ADS, я нашел драйвер и диалектздесь: https://groups.google.com/forum/#!topic/nhibernate-development/s7HLs-aEXDk

Я создал таблицу и этот код:

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

Возможно, что-то не так с диалектом?Я очень ценю любую помощь в этом, спасибо!

1 Ответ

0 голосов
/ 03 декабря 2018

Из комментариев проблема заключается в следующем:

NHibernate с используемой вами грамматикой выдает этот код:

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

select NEWIDSTRING() from system.iota;

Очевидно, что драйвер ASP.NET для ADS не может обработать эту формупередачи параметров правильно.

Элемент базы знаний , с которым вы связались, чтобы предложить вместо SQL использовать именованные параметры:

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

select NEWIDSTRING() from system.iota;

Я не знаю достаточноNHibernate, чтобы рассказать вам, как этого можно достичь.

...