我有一个过程,它接受一个时间戳参数,该参数是一个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()
答案 0 :(得分:0)
使用NHibernateUtil.BinaryBlobType而不是Timestamp。