SqlDateTime溢出使用NHibernate和存储过程

本文关键字:存储过程 NHibernate 溢出 SqlDateTime | 更新日期: 2023-09-27 17:54:27

我是新手。我创建了映射文件,模型和工作。但是现在我试图使用存储过程插入,我使用当前日期,它抛出一个异常。

我的映射:

  <class name="MyClass" table="table_name">
    <id name="Id" column="id">
      <generator class="identity"/>
    </id>
    <property name="Sum" column="sum"/>
    <property name="Direction" column="direction"/>
    <property name="Date" column="datetime"/>
    <property name="Number" column="number"/>
    <sql-insert xml:space="preserve">
      EXECUTE dbo.pr_AddNew @sum = ?, @direction = ?
    </sql-insert>
  </class>

我的类:

public class MyClass
{
    public virtual int Id { get; set; }
    public virtual DateTime Date { get; set; }
    public virtual decimal Sum { get; set; }
    public virtual byte Direction { get; set; }
    public virtual int Number { get; set; }
}

和我的存储过程

CREATE PROCEDURE pr_AddNew
    @sum decimal(19, 2),
    @direction int
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO dbo.table_name([datetime], sum, direction, number)
        VALUES(GETDATE(), @sum, @direction, dbo.fn_GetNextNumber())
END
GO

正如你所看到的,我正在使用GETDATE()函数来获取数据库端的当前日期。

下面是我的Test方法:
    [TestMethod]
    public void AddTest()
    {
        var myClass= new MyClass{ Direction=0, Sum=150};
        IRepository repository = new MyClassRepository();
        repository.Add(myClass);
        using (ISession session = _sessionFactory.OpenSession())
        {
            var fromDb = session.Get<MyClass>(myClass.Id);
            Assert.IsNotNull(fromDb);
            Assert.AreNotSame(myClass, fromDb);
        }
    }

这段代码给了我一个异常:"SqlDateTime溢出。"

所以如果我创建myClass实例为:

var myClass= new MyClass{ Direction=0, Sum=150, Date=DateTime.Now()};

一切正常。据我所知,问题在于SQL和c#中最小可能的DateTime值之间的差异。但我不需要传递datetime值sql。我能用这个做什么?

SqlDateTime溢出使用NHibernate和存储过程

您必须将其映射为生成的列。它告诉NH不要将其发送到数据库进行插入或更新,并且还告诉NH在插入或更新后加载值(这可能是性能问题)。

generated="never|insert|always"

在你的例子中:

<property name="Date" column="datetime" generated="insert"/>
顺便说一下,有一种完全不同的方法可以得到相同的结果。您可以在类的构造函数中设置Date并正常映射它。相比之下,处理存储过程要轻松得多。