2013-09-01 65 views
0

因此,我需要將數據從現有數據庫SqLite移動到新的SqlCe數據庫。我用NHibernate加載實體,因爲這是我用於SqLite數據庫的DAL。新數據庫(SqlCe)使用EF Code-First/DbContext創建。SqlCe,EF5,IDENTITY_INSERT用於自動生成Ids的表格

現在我只想爲每個表創建一次性使用方法,以手動插入實體與其現有的ID(因爲我想保留Ids)。這些表使用自動生成的ID,所以我需要重寫這個。問題是,最簡單的方法是什麼?可以用DbContext完成嗎?

最好它應該是強類型的,但到目前爲止我嘗試使用SqlCeConnection .CreateCommand/.ExecuteNonQuery,與硬類型的SQL。但是不確定這裏的語法,因爲我不太瞭解SQL。

對於下面的代碼,指定變量鍵的各種嘗試產生以下例外;

@ 0 =>消息=缺少一個參數。 [Parameter ordinal = 8]

'{0}'=>消息=數據轉換失敗。 [OLE DB狀態值(如果已知)= 2]

{0} =>消息=數據轉換失敗。 [OLE DB狀態值(如果已知)= 2]

 var conn = new SqlCeConnection("Data Source=" + DbFileName); 
     conn.Open(); 
     var cmd = conn.CreateCommand(); 
     cmd.CommandText = @"SET IDENTITY_INSERT AccountBases ON;"; 
     cmd.ExecuteNonQuery(); 

      cmd.CommandText = string.Format(
       @"INSERT INTO AccountBases (
       AccStartTime, AccType, Broker, 
       ClientID, ConnType, CreationDate, 
       Guid, Id, Name, 
       Strategy) 
       VALUES({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9});", 
       a.AccStartTime, 
       a.AccType, 
       a.Broker, 
       a.ClientID, 
       a.ConnType, 
       a.CreationDate, 
       a.Guid, 
       a.Id, 
       a.Name, 
       a.Strategy); 
      cmd.ExecuteNonQuery(); 

     conn.Close(); 

回答

0

決不格式字符串爲您查詢。始終使用參數化查詢。

在你的特定情況下,最可能的問題是你傳遞一個datetime(CreationDate)而不用像這樣引用它:'{0}'。