TimeStamp参数CreateSQLQuery nHibernate

时间:2016-04-15 12:27:43

标签: c# sql-server visual-studio nhibernate

我有一个过程,它接受一个时间戳参数,该参数是一个SQL Server RowVersion。

在这个包含RowVersion的映射表中,我收到一个字节[],如下所示:

public class ClassTest
{
    public virtual byte[] RowVersion {get; set;}
}

public void Override(ModelMapper mapper)
{

   mapper.Class<ClassTest>(m =>
   {
    m.Table("tblTable");

    m.Version(x => x.Rowversion, x =>
            {
                x.Generated(VersionGeneration.Always);
                x.Type(new NHibernate.Type.BinaryBlobType());
                x.UnsavedValue(null);
                x.Column(c =>
                {
                    c.Name("RowVersion");
                    c.NotNullable(true);
                    c.SqlType("timestamp");
                });
            });
  });
    }
}

}

我的问题是如何作为参数发送我的byte [],因为该过程需要一个TimeStamp,尝试这种方式,但它不起作用。

public static int TestProc(ISessionFactory factory, 
        byte[] rowVersion)
{
    var query = session.CreateSQLQuery("exec proc_test :RowVersion")
      .SetParameter("RowVersion", rowVersion, NHibernateUtil.Timestamp)
      .List();
}

不允许从数据类型datetime到timestamp的隐式转换。使用CONVERT函数运行此查询。

解决方案

我解决了问题,也许不是最优雅的方式,但解决了我的问题。我将我的字节数组(byte [])转换为Int64(因为我的字节数组是8个字符到4个字符的情况只转换为Int32。在我的程序中,我的参数TIMESTAMP的类型改为BIGINT,在这两种情况下,作为应用程序数据库,BIGINT的RowVersion转换值和byte []到Int64是相同的。

 byte[] rowVersion;
  var rowVersion64 = BitConverter.ToInt64(rowVersion, 0); 
var query = session.CreateSQLQuery("")
.SetInt64("RowVersion", rowVersion64)
.List()

1 个答案:

答案 0 :(得分:0)

使用NHibernateUtil.BinaryBlobType而不是Timestamp。