0

したがって、既存のデータベース SqLite から新しい SqlCe データベースにデータを移動する必要があります。これは SqLite データベースに使用する DAL であるため、NHibernate でエンティティをロードします。新しいデータベース (SqlCe) は EF Code-First / DbContext で作成されます。

ここで、各テーブルに 1 回限りのメソッドを作成して、既存の ID を持つエンティティを「手動で」挿入したいだけです (ID を保持したいため)。テーブルは自動生成された ID を使用するため、これをオーバーライドする必要があります。質問は、それを行う最も簡単な方法は何ですか? DbContextでそれを行うことはできますか?

できれば強く型付けする必要がありますが、これまでのところ、ハード型付けされた SQL で SqlCeConnection .CreateCommand / .ExecuteNonQuery を使用してみました。しかし、私はあまりSQLを知らないので、ここでの構文はわかりません。

以下のコードでは、変数キーを指定しようとすると、次の例外が発生します。

@0 => Message=パラメータがありません。[ パラメータ序数 = 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();
4

1 に答える 1

0

クエリの文字列をフォーマットしないでください。常にパラメータ化されたクエリを使用してください。

あなたの特定のケースでは、最も可能性の高い問題は、'{0}' のように引用符を付けずに日時 (CreationDate) を渡すことです。

于 2013-09-01T16:17:37.360 に答える