5

私は現在、Dapperについて学んでいます。私はここや他の場所(これを含む)をたくさん検索しましたが、疑問に対する具体的な答えを見つけることができませんでした:

Dapper は一般的な SQL 方言を使用していますか、それとも DB エンジンに固有のものですか? つまり、基盤となるデータベース エンジンで期待される SQL 構文を使用しているということですか? 最初は、十数件以上の例を読んだ後、SQL クエリは一般的なものだと思っていましたが、現在 PostgresSQL ODBC を試していると、構文とパラメーターに問題が発生しました。

この例の POCO クラスを使用すると ...

public class CardType {

    //Autoincremented Key
    public int Id { get; set; }

    public string Type { get; set; }

    public string Description { get; set; }
}

...次の行は機能しません:

_connection.Execute(@"INSERT cardtypes (type, description) VALUES (@Type,  @Description)", cardType);

まず、テーブルを指定する前に "INTO" 句が必要なため、この行は ODBC 例外をスローします。また、パラメーターも機能しません。間違っていなければ、PostgresSQL パラメーターは「?」で設定されているためです。"@keyword" ではなく記号を使用してください。GitHubページで、これを見つけることができます。

Dapper には DB 固有の実装の詳細はありません。SQLite、SQL CE、Firebird、Oracle、MySQL、PostgreSQL、SQL Server など、すべての .NET ADO プロバイダーで機能します。

だから私はこれで迷っています。:) 多くの実験を行った後、すべての PostgresSQL を配置すると、期待どおりに機能することがわかりました。たとえば、次のすべてのケースが機能しました。

//Manually parameters

var query = @"INSERT INTO cardtypes (type, description) values ('Administrator', 'The Boss')";
_db.Execute(query);


//Dynamic parameters

var dynamicParameters = new DynamicParameters();
dynamicParameters.AddDynamicParams(new {
    cardType.Type,
    cardType.Description
});

var query = @"INSERT INTO cardtypes (type, description) values (?, ?)";    //Note the '?' symbol
_db.Execute(query, dynamicParameters);


//Interpolating values
var query = $@"INSERT INTO cardtypes (type, description) values ('{cardType.Type}', '{cardType.Description}')";
_db.Execute(query);

これらの以前のケースはうまくいきました。しかし、SQL クエリが一般的な SQL 方言なのか、特定のデータベース エンジンの方言なのかを理解するのに混乱しています。

また、Dapper.Contrib を試してみましたが、INSERT ステートメントでも失敗します。たとえば、次のようになります。

_db.Insert(new CardType() {
    Type = "Administrator",
    Description = "The Boss"
});

それも失敗します...奇妙な「[」文字例外。

私が間違っていることは何ですか?

よろしく!

4

1 に答える 1

5

Dapper は、クエリの解析やカスタム DSL の提供を試みません。むしろ、選択した ADO.NET プロバイダーにクエリを直接渡します。場合によっては、途中でいくつかの調整を行いますが、一般的な意味では、そのままです。

postgresql の場合、IIRC パラメータはアット プレフィクスではなく、コロン プレフィクスです。:fooの代わりに使ってみてください@foo

于 2016-02-12T18:41:03.630 に答える