我有一個過程,需要一個參數是一個時間戳,參數是一個SQL Server RowVersion。TimeStamp參數CreateSQLQuery nHibernate
在包含我接收爲一個字節[]的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();
}
從數據類型到的日期時間時間戳隱式轉換是不允許的。使用CONVERT函數來運行此查詢。
解決方案
我解決了這個問題,也許不是最優雅的方式,但解決我的問題。我將字節數組(byte [])轉換爲Int64(因爲我的字節數組是8個字符到4個字符,所以情況只能轉換爲Int32。在我的過程中,將參數TIMESTAMP的類型更改爲BIGINT,既作爲應用程序的數據庫,爲BIGINT的RowVersion轉換值,並且字節[]到Int64的是一樣的。
byte[] rowVersion;
var rowVersion64 = BitConverter.ToInt64(rowVersion, 0);
var query = session.CreateSQLQuery("")
.SetInt64("RowVersion", rowVersion64)
.List()
由於重複的問題說,'NHibernateUtil.Timestamp'是一個DateTime,你應該使用'Binary'或者'BinaryBlob'。這個錯誤已經提到'datetime'的值被傳遞了 –