2016-04-15 56 views
0

我有一個過程,需要一個參數是一個時間戳,參數是一個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() 
+0

由於重複的問題說,'NHibernateUtil.Timestamp'是一個DateTime,你應該使用'Binary'或者'BinaryBlob'。這個錯誤已經提到'datetime'的值被傳遞了 –

回答

0

使用NHibernateUtil.BinaryBlobType而不是時間戳。

+0

我用HibernateUtil.Binary和HibernateUtil.Binary Blob進行了試驗並返回了se gunte錯誤:**'/'附近的語法不正確。\ r \ n'value'附近的語法不正確。\ r \ n','附近語法不正確。** – user11890

相關問題