2012-09-07 13 views
8

まずは、MS Access DBを使用していて、変更できません。Dapper&MS Access - 読み込みができません。書き込みはありません

これは正常に動作します:DBに

using (OleDbConnection conn = ConnectionHelper.GetConnection()) 
{ 
    OleDbCommand cmd = new OleDbCommand(
    "update Students set FirstName = @firstName, City = @city where LastName = @lastName", 
    conn 
); 
    cmd.Parameters.AddWithValue("firstName", "John"); 
    cmd.Parameters.AddWithValue("city", "SomeCity"); 
    cmd.Parameters.AddWithValue("lastName", "Smith"); 

    conn.Open(); 
    var result = cmd.ExecuteNonQuery(); 
    conn.Close(); 
} 

これは...それはエラーなしで実行されませんが、それは "SomeCity" として姓を設定し、:これは正常に動作します

using (OleDbConnection conn = ConnectionHelper.GetConnection()) 
{ 
    conn.Open(); 
    var results = conn.Query<string>(
    "select FirstName from Students where LastName = @lastName", 
    new { lastName= "Smith" } 
); 
    conn.Close(); 
} 

「John」としての都市:

using (OleDbConnection conn = ConnectionHelper.GetConnection()) 
{ 
    conn.Open(); 
    var results = conn.Query<string>(
    "update Students set FirstName = @firstName, City = @city where LastName = @lastName", 
    new { firstName = "John", city = "SomeCity", lastName = "Smith" } 
); 
    conn.Close(); 
} 

アイデアをお持ちですか?

using (OleDbConnection conn = ConnectionHelper.GetConnection()) 
{ 
    DynamicParameters parameters = new DynamicParameters(); 
    parameters.Add("firstName", "John"); 
    parameters.Add("city", "SomeCity"); 
    parameters.Add("lastName", "Smith"); 

    conn.Open(); 
    var result = conn.Query<string>(
    "update Students set FirstName = @firstName, City = @city where LastName = @lastName", 
    parameters 
); 
    conn.Close(); 
} 
+0

ような何か..私は... –

+0

注REPROしようとする必要があります。ただ、SQL Expressを2008に再現してみました、それが正常に動作しますが... –

+0

私がやりましたこれはSql Serverでうまくいきました...だから私はこれがMS Accessのみであると思っています – Trev

答えて

8

いくつかの掘削後、私は原因を見つけることができた:

以下

はDapperののSqlMapperからCreateParamInfoGeneratorデリゲートです:EDIT

Dapperのは、私がDynamicParametersを使用している場合は動作しますBELOW

public static Action<IDbCommand, object> CreateParamInfoGenerator(Identity identity) 
    { 

     // code above here 
     IEnumerable<PropertyInfo> props = type.GetProperties().OrderBy(p => p.Name); 

小道具は、OrderBy(p => p.Name)によって並べ替えられた都市全体のパラマウントです。

次に、順序が重要なIDbCommandパラメータにPropsが追加されます。

私がOrderBy()節をコメントアウトすると、すべてが機能します。

私も試験DynamicParametersは意図的に先行都市に移動する属性を並べ替え:

 var parameters = new DynamicParameters(); 
     parameters.Add("city", "SomeCity"); 
     parameters.Add("firstName", "John"); 
     parameters.Add("lastName", "Smith"); 

     var result = dbConnection.Query<string>(
      "update Students set FirstName = @firstName, City = @city where LastName = @lastName", 
      parameters 
     ); 

上記のようにうまく動作しませんでしたが、その属性の順序が理由です!

私は

は、この情報がお役に立てば幸いです...あなたは今のSqlMapperのローカルコピーを変更し、([並べ替えを削除します)とマルクからの正式な判決を待つことができますね。

+1

MS Accessは[パラメータの順番については十分です](http://stackoverflow.com/a/1476818/47121)。私は '.OrderBy(p => p.Name)'コードをSqlMapperから削除しようとしました。また、このコードを削除することで別の意味があるかどうかをMarcやSamから知りたいと思います。 – Trev

+0

私はそれも知らなかった。知っておいてよかった!私はOrderBy()節の目的についても興味があります。 –

+0

答えに対するコメント(http://stackoverflow.com/a/19481354/2144390)によると、これはDapperの現在のバージョンではもはや問題ではありません。 –

4

@名前、@ id、@ priceの代わりにuse parameter names like @param1, @param2に行ったのと同様の問題がありました。そのため、SQLMapper.csファイルを変更することなく、注文は同じままです。

奇妙だ

public void Update(Movie movie) 
{ 
    var sql = "UPDATE myDB.movies set [email protected], [email protected] where [email protected]"; 
    db.Execute(sql, new { param1 = movie.Title, param2 = movie.Genre, param3 = movie.ID }); 
} 
+0

Dapperと最後に作業して以来、状況が変わっている可能性があります。答え[ここ](http://stackoverflow.com/a/19481354/2144390)へのコメントによると、これはもはや現在のバージョンでの問題ではありません。 –

+1

@GordThompsonリンクをありがとう。私はバージョン1.13でNuGet経由で同じ問題を抱えています。 –

+0

1.50.2で同じ問題が発生しています – RobinAtTech

関連する問題