具有自动生成ID的表的SqlCe、EF5、IDENTITY_INSERT
本文关键字:EF5 INSERT IDENTITY 自动生成 ID SqlCe | 更新日期: 2023-09-27 18:29:52
因此,我需要将数据从现有数据库SqLite移动到新的SqlCe数据库。我用NHibernate加载实体,因为这是我用于SqLite数据库的DAL。使用EF Code First/DbContext创建新数据库(SqlCe)。
现在我只想为每个表制作一个一次性使用的方法;手动";插入具有现有Id的实体(因为我想保留Id)。这些表使用自动生成的Id,所以我需要覆盖它。问题是,最简单的方法是什么?可以用DbContext完成吗?
最好它应该是强类型的,但到目前为止,我尝试使用SqlCeConnection.CreateCommand/.ExecuteNonQuery和硬类型SQL。但我不确定这里的语法,因为我对SQL不太了解。
对于下面的代码,各种指定变量键的尝试都会产生以下异常;
@0=>消息=缺少参数。[参数序号=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();
永远不要为查询设置字符串格式。始终使用参数化查询。
在您的特定情况下,最可能的问题是您传递了一个日期时间(CreationDate),而没有像这样引用它:"{0}"。