2016-09-06 10 views
0

私は製品クラスを持っており、AccessデータベースでDapperを評価しようとしました。選択、削除、および挿入操作は正常ですが、更新操作に問題があります。Dapper with Access、部分的に動作しない更新文

私は更新されますProductNumberそれが動作します(updateStatement2)と説明に基づいて説明を変更しようとすると、以下のコードのみ)片道で働いて、私はProductNumberを変更しようとしたときに基づいています説明(updateStatement1)正常に動作せず、ProductNumberが更新されません。それは私にとっては奇妙なことです。それはバグですか、何か不足していますか?私のデータベースは基本的なもので、主キーは設定されていません。私はDapperのバージョン1.50.2を使用しています

public class Products 
{ 
    public string ProductNumber { get; set; } 
    public string Description { get; set; } 
} 

static void Main(string[] args) 
{    
    using (var con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb")) 
    { 
     Products product2 = new Products(); 
     product2.ProductNumber = "P2"; 
     product2.Description = "TestProduct2Changed"; 
     var updateStatement2 = @"Update Products Set Description = @Description Where ProductNumber = @ProductNumber"; 
     int outp2 = con.Execute(updateStatement2, product2); 


     Products product1 = new Products(); 
     product1.ProductNumber = "P3Changed"; 
     product1.Description = "TestProduct3"; 
     var updateStatement1 = @"Update Products Set ProductNumber = @ProductNumber Where Description = @Description"; 
     int outp1 = con.Execute(updateStatement1, product1); 
    } 
} 

(詳細については、以下の私のコードを参照)

下のスクリーンショットを添付しています。これは、ADOのAccessコマンドは、彼らがSQLクエリに表示されるのと同じ順序で存在することがパラメータを必要とするように見えます私のデータベースのスクリーンショット

enter image description here

+0

値に空白が含まれていますか(説明)? – Shyju

+0

動的パラメータのように渡すと機能します。私はDapperのいくつかの問題を考えています。 con.Execute(updateStatement2、new {ProductNumber = "P3Changed"、Description = "TestProduct3"}); – RobinAtTech

答えて

1

です。元のコードで

は、作品のクエリのために、パラメータがアルファベット順にクエリ文字列に表示されます -

Update Products Set Description = @Description Where ProductNumber = @ProductNumber 

プロパティがアルファベット順に「product2」から取られているので、これは動作します。これは設計によるものではないかもしれませんが、リフレクションがそれらをリストする順序かもしれません。失敗したクエリで

、パラメータは逆のアルファベット順に表示されます -

Update Products Set ProductNumber = @ProductNumber Where Description = @Description 

...とパラメータ値がアクセス中に誤って割り当てられますので、これは失敗します。

これは、動的パラメータ代替のパラメータの順序を変更することで確認できます。動的なパラメータを使用しようとしましたが、パラメータがSQLクエリに登場したのと同じ順序であっても、それが失敗した場合は失敗しました。私が使用しているデータベースはあなたと全く同じではありませんが、次は私が話しているものを説明しなければならない。これについての詳細な情報を検索しようとしますが

// Doesn't work (parameter order is incorrect) 
con.Execute(
    "Update People Set PersonName = @PersonName Where Notes = @Notes", 
    new { Notes = "NotesChanged", PersonName = "New Name" } 
); 

// DOES work (parameter order is correct) 
con.Execute(
    "Update People Set PersonName = @PersonName Where Notes = @Notes", 
    new { PersonName = "New Name", Notes = "NotesChanged" } 
); 

、私は残念ながらそうです、この答えに出くわしました問題を確認するために:https://stackoverflow.com/a/11424444/3813189

を私はそれはあなたが、彼らは必要があるために、クエリを解析し、パラメータを取得するために、いくつかの魔法を行うには、あなたの他の質問のいずれかに言及したcustom SQL generatorのために可能であるかもしれないことを推測します表示され、それらが正しい順序で提供されていることを確認します。誰かがDapperExtensionsのアクセスコネクタを維持している場合、iを引き上げる価値があるかもしれませんssue。現時点では、あなたは正しいと思っており、図書館の問題です。

関連する問題