【问题标题】:SqlCe, EF5, IDENTITY_INSERT for table with autogenerated IdsSqlCe、EF5、IDENTITY_INSERT 用于具有自动生成 Id 的表
【发布时间】:2013-09-01 16:11:58
【问题描述】:

所以我需要将数据从现有数据库 SqlLite 移动到新的 SqlCe 数据库。我使用 NHibernate 加载实体,因为这是我用于 SqLite 数据库的 DAL。使用 EF Code-First / DbContext 创建新数据库 (SqlCe)。

现在我只想为每个表创建一个一次性使用方法,以“手动”插入具有现有 ID 的实体(因为我想保留 ID)。这些表使用自动生成的 ID,所以我需要覆盖它。问题是,最简单的方法是什么?可以用 DbContext 完成吗?

最好它应该是强类型的,但到目前为止,我尝试使用带有硬类型 SQL 的 SqlCeConnection .CreateCommand / .ExecuteNonQuery。但不确定这里的语法,因为我不太了解 SQL。

对于下面的代码,指定变量键的各种尝试都会产生以下异常;

@0 => 消息=缺少参数。 [参数序数=8]

'{0}' => Message=数据转换失败。 [ 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();

【问题讨论】:

    标签: c# .net sql entity-framework sql-server-ce


    【解决方案1】:

    永远不要为您的查询格式化字符串。始终使用参数化查询。

    在您的特定情况下,最可能的问题是您传递了一个日期时间 (CreationDate) 而没有像这样引用它:'{0}'。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      相关资源
      最近更新 更多