2017-12-10 4 views
1

私はDapperを初めて使用しています。私のコードが実行されていないと、以下の理由を知りたいのですが?varcharのDbString、IsFixedLength、IsAnsi

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

SQL Server上:あなたはこの方法でそれを渡すようにしてくださいPARAMを使用して にvarchar列をwhere句を実行している場合

Ansi Strings and varchar

Dapperのは、varchar型のparamsをサポートしていますユニコード以外を照会するときにユニコード とansiを照会するときは、ユニコードを使用することが重要です。以下は

などDBSTRINGを使用せずにSQL Server 2012のに対して実行されます私のコード、

create table Author (
Id int identity(1,1), 
FirstName varchar(50), 
LastName varchar(50) 
); 
go 
insert into Author (FirstName, LastName) values ('Tom', 'John'); 

     public Author FindByVarchar(string firstName) 
     { 
      using (IDbConnection db = DBHelper.NewSqlConnection()) 
      { 
       return db.Query<Author>("Select * From Author WHERE FirstName = @firstName", new { firstName }).SingleOrDefault(); 
      } 
     } 

ある質問:

1は、なぜこのような場合に使用するタイプをDBSTRINGされますか?

2「abcde」が5のときに長さが10(たとえば長さ= 10)に設定されるのはなぜですか?

3現在のコードが動作するときにDbStringを使用する必要がありますか?

4ユニコード列にIsAnsi = falseを設定するのは正しいですか?

5 varcharカラムの場合、IsFixedLength = falseを設定して、設定の長さを無視するのは正しいですか?

+0

DbStringが推奨される理由は、インデックスシークではなくインデックススキャンの結果となるNVARCHARパラメータであり、パフォーマンスに影響を与える可能性があると考えられます。https://lostechies.com/jimmybogard/2012/07/18/troubleshooting-sql-index-performance-on-varchar-columns /この場合、DbStringの手間ではなく、WHERE FirstName = CAST(@firstName AS VARCHAR(n))を使用することを検討します。 。私は(これはテストしていない)と仮定すると、これはインデックスシークをもたらすでしょう。 – Joe

+0

私はもう少し前に同様の質問をしましたが、満足のいく回答はありませんでした。しかし、それについて考えると、上記のコメントの結論に至りました。https://stackoverflow.com/questions/19362113/dapper-and-varchars – Joe

+0

正しいタイプのパラメータ(例:varchar/nvarchar)を定義するストアドプロシージャが使用されている場合は、 DbStringは必要ありません。それが正しいか? – Pingpong

答えて

2

この例の目的は、データタイプがchar(10)であるシナリオを記述していることです。 "abcde"を使用したばかりの場合、Dapperはnvarchar(5)が適切だと思うかもしれません。これは、特にwhere節では非常に非効率的です.RDBMSはインデックスを使用できないと判断し、代わりにテーブル内のすべての行に対して文字列変換を行う必要があります。からnvarcharバージョン。このため、DbStringが存在します。正確にはのテキストデータのパラメータ設定方法を制御するのに役立ちます。

私は、これはあなたの1と2

3に答えると思う:あなたは、ANSI(非Unicodeテキスト)または固定幅のテキストを使用していますか?はい

5:はい

4 + 5の組み合わせ:あなたがnvarchar使用している場合:をちょうど使用します常に回避ユニコード

4場合ANSIのデフォルトはまた、グローバルに設定できることに注意してくださいstring

+0

Q3では、クエリのデフォルト設定に依存しているのでしょうか? DbStringを使用すると、固定または可変であるかどうか、およびANSIまたはUNICODEを明示的に指定するのは正しいですか?パラメータを使用するストアドプロシージャを使用する場合はどうなりますか?だからこの問題は存在しないのですか?前もって感謝します。 – Pingpong

+0

@pingpingもしあなたがsprocを呼び出しているのであれば、それらが間違っていても、値は一度しか変換されません - sprocの中では正しい型になりますので、その場合は同じ問題は見られません。 sprocsの外、はい:DbStringはANSI対Unicodeを明示的に制御し、可変長 –