2016-09-07 20 views
1

[c#、DAPPER、MS Access]を使用してデータを挿入するだけですが、c#の[DateTime]列は[date/time]列MsAccessで "条件式のデータの不一致"のような問題が発生します。Oledb、C#、Dapperを使用した条件式のデータの不一致

長い研究の末、linkが得られましたが、ここでは「フロア」ソリューションは機能しません。どんな提案も大歓迎です。

答えて

0

は、私の作品のようなものを試してみてください:ここ

@CLStart = DateTime.Parse(Convert.ToDateTime(client.CLStart).ToShortDateString()) 

client.CLStartは、データ型DateTime?である - 私はDapperのと組み合わせてSQLクエリを手書きするとき前にこの問題を持っていたNullable<DateTime>

+0

ありがとう、私はこれを試してみましょう。 –

0

とMS Accessクエリに複数のパラメータがある場合。 問題は、アクセスエンジンがパラメータの順序を考慮せず、アルファベット順にソートすることです。例えば

テイクMyTableというという名前のこのサンプル表:

public class MyClass 
{ 
    public int MyNumber { get; set; } 
    public DateTime MyDate { get; set; } 
} 

そしてMyClassのがあなたに渡されたインスタンスを持っていた:

MyNumber Number 
MyDate  Date/Time 

あなたがC#のMyClassクラスを持っていたと仮定すると、 Dapperの声明の後:

connection.Execute("INSERT INTO MyTable (MyNumber, MyDate) VALUES (@MyNumber, @MyDate)", myClass); 

System.Data.OleDb.OleDbExceptionによって: '条件式のデータ型が一致しません。'というステートメントが失敗します。

これは、Accessによってパラメータがアルファベット順にソートされるためです。この場合、日付と日付に数字をスティックして番号にスティックします。

アルファベット順にパラメータを命名するか、アルファベット順に並べ替えることで回避できます。この場合、上記の記述は次のように書き直すことができます:

connection.Execute("INSERT INTO MyTable (MyDate, MyNumber) VALUES (@MyDate, @MyNumber)", myClass); 
+0

いくつかのトレイルの後、私はそれがアクセスエンジンではないことを発見しました。これはDbCommandを生成するためにあなたの 'MyClass'をアルファベットにマッピングするDapperのようなものです。 'new {MyNumber = 1、MyDate = Today}'のような匿名のオブジェクトを使って、デフォルトのアルファベット順を上書きする最初のステートメントを照合することができます。エラーは発生しません。 Dapperのマッピングリフレクションは、エンティティのプロパティの順序に関係しているようです。そして、 'OleDbCommand'を使って手をコード化してみてください。順序は 'cmd.Parameters.Add'に依存します。 – joe

関連する問題