ダッパーとvarchars

dapper varchar

質問

Dapper .NETプロジェクトのホームページに次のコメントがあります

Dapperはvarcharのパラメータをサポートしています.paramを使用してvarcharの列でwhere句を実行する場合は、必ずこのように渡します。

    Query<Thing>("select * from Thing where Name = @Name", new {Name = 
    new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });

SQL Serverでは、ユニコードを照会するときにユニコードを使用し、非ユニコードを照会するときにansiを使用することが重要です

私はDapperをvarcharパラメータを持つストアドプロシージャがたくさんある従来のデータベース(SQL Server 2008)で使用するために評価していますが、この制限によって少し混乱します。

手作りのADO.NETコードでは、上記のクエリで次のように使用します。

new SqlParameter("@Name", "abcde")

それがユニコードであるかどうか、またその長さを指定することなく、

  • Dapperでこの冗長なDbString構文を必要とし、列の長さ、IsFixedLengthおよびIsAnsiを指定する必要があるのはなぜですか?

  • varcharカラムでIsFixedLength = true(なぜcharまたはncharカラムで真であると思いますか?)

  • ストアドプロシージャのパラメータにこのようなDbStringを使用する必要がありますか?

私はDapperのDALコードをより簡潔にすることを期待していましたが、これはvarcharのパラメータをより冗長にしているようです。

更新

私はもう少し調べて、なぜDapperがこのvarcharの制限を持つのか理解しようとしています。手作りのコードではそうは見えませんが、通常は次のように入力パラメータを作成します。

var parameter = factory.CreateParameter(); // Factory is a DbProviderFactory
parameter.Name = ...;
parameter.Value = ...;

私は特にそれを強要しない限り、プロバイダは独自のルールを使ってDbTypeを推論するようにしておきます。

DapperのDynamicParametersクラスを見ると、次のようにパラメータを作成するAddParametersメソッドがあります。

var dbType = param.DbType; // Get dbType and value
var val = param.Value;     // from 

...
// Coerce dbType to a non-null value if val is not null !!!!!
if (dbType == null && val != null) dbType = SqlMapper.LookupDbType(val.GetType(),name);
...
var p = command.CreateParameter();
...
if (dbType != null)                     
{                         
    p.DbType = dbType.Value;                     
}

IDataParameter.DbTypeIDataParameter.DbTypeを、プロバイダが独自のルールを使用するようにするのではなく、独自のアルゴリズムでルックアップする値に明示的に変換します。

これには正当な理由はありますか? Dapperがvarcharパラメータをサポートしていることについてのコメントに照らして、私にとっては間違っているようです。

人気のある回答

ODBCを使用する場合は、この構文が必要です。

DapperのC#では、CHAR(30)フィールドをC#のDbStringとして定義する必要があります。また、長さ(30)とansi(true)の値を設定する必要があります。それ以外の場合は、 "Text / Byte BLOBタイプを変換しようとしていません"というエラーが表示される可能性があります。

私は私のパラメータをDbString()として定義し、長さとANSI値を設定するまで、Informixに接続するためにODBCを使用してこのエラーが発生しました。

詳細はこちら



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ