2013-10-14 9 views
10

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パラメータをサポートしていることについてのコメントに照らして、私にとっては間違っているようです。

答えて

-1
var param = new { Varchar1 = "", Varchar2 = "" }; 
db.Query("SP", param, commandType:CommandType.StoredProcedure); 
+0

ようこそスタックオーバーフロー!コードのみの回答はそれほど有用ではありません。それがどのように/なぜそれが質問に答えるかを説明する詳細を加えることができれば助けになるでしょう。 – SiHa

+0

これは少し不明な質問ですが、varcharsとストアドプロシージャの使い方を十分に理解しておく必要があります。 – dbol

0

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

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

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

More info here

関連する問題