0

製品クラスがあり、Access データベースで Dapper を評価しようとしました。選択、削除、および挿入操作は正常に機能していますが、更新操作に問題があります。以下のコードで一方向のみで動作しています)

ProductNumberに基づいて説明を変更しようとすると(updateStatement2) 機能し、説明は更新されますが、説明に 基づい て製品番号を変更しようとすると(updateStatement1) は機能せず、ProductNumber は更新されません。私には少し奇妙でした。それはバグですか、それとも何か不足していますか? 私のデータベースは基本的なもので、主キーは設定されていません。以下にスクリーンショットを添付しました

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

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);
    }
}

Dapper バージョン 1.50.2 を使用しています。これは私のデータベースのスクリーンショットです

ここに画像の説明を入力

4

1 に答える 1

1

ADO Access コマンドでは、パラメーターが SQL クエリに表示される順序と同じ順序で存在する必要があるようです。

元のコードでは、機能するクエリの場合、パラメーターはクエリ文字列にアルファベット順に表示されます-

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

これは、プロパティが「product2」からアルファベット順に取得されるためです。これは設計によるものではない可能性があります。リフレクションがそれらをリストする順序である可能性があります。

失敗したクエリでは、パラメーターはアルファベットの逆順で表示されます-

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

.. パラメータ値が Access 内で誤って割り当てられるため、これは失敗します。

これは、動的パラメーターの代替でパラメーターの順序を変更することで確認できるはずです。動的パラメーターを使用してみましたが、パラメーターが 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

他の質問の1つで言及したカスタムSQLジェネレーターが、クエリを解析し、パラメーターを表示する順序で取得して、それらが正しい順序で提供されます。誰かが DapperExtensions の Access コネクタを維持している場合は、問題を提起する価値があるかもしれません。現時点では、あなたの言うことは正しいと思いますし、それは図書館の問題だと思います。

于 2016-09-06T13:59:20.773 に答える