the Dapper .NET project home pageに次のコメントがあります。ダッパーとvarchars
Dapper supports varchar params, if you are executing a where clause on a varchar column using a param be sure to pass it in this way:
Query<Thing>("select * from Thing where Name = @Name", new {Name =
new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true });
On Sql Server it is crucial to use the unicode when querying unicode and ansi when querying non unicode
私はvarchar型のパラメータを持つストアドプロシージャの多くで、レガシーデータベース(SQL Server 2008の)で使用するためにDapperのを評価しています、と私は、この制限によって少し混乱しています。手作りのADO.NETコードで
、私は上記のクエリのために、以下の使用したい:それはユニコードかどうか、また長さだかどうかを指定しなくても
new SqlParameter("@Name", "abcde")
を。
なぜDapperでこの冗長なDbString構文が必要で、列の長さIsFixedLengthとIsAnsiを指定する必要がありますか?
varcharカラムのIsFixedLength = true(なぜcharまたはncharカラムの場合は真であると思いますか?)
ストアドプロシージャのパラメータにこのようなDbStringを使用する必要がありますか?
私は私のDALコードをより簡潔にするためにDapperの期待していたが、これはvarchar型のパラメータについては、より詳細な作りしているようです。私はDapperのは、私は通常と私は、私の手作りのコードを持っているようには見えないこのvarchar型の制限を、持っているだろう理由を理解しようとすると、ビットさらに研究してきました
UPDATE
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.DbType
)。
これには正当な理由はありますか? Dapperがvarcharパラメータをサポートしていることについてのコメントに照らして、私にとっては間違っているようです。
ようこそスタックオーバーフロー!コードのみの回答はそれほど有用ではありません。それがどのように/なぜそれが質問に答えるかを説明する詳細を加えることができれば助けになるでしょう。 – SiHa
これは少し不明な質問ですが、varcharsとストアドプロシージャの使い方を十分に理解しておく必要があります。 – dbol