私は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句を実行している場合
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を設定して、設定の長さを無視するのは正しいですか?
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
私はもう少し前に同様の質問をしましたが、満足のいく回答はありませんでした。しかし、それについて考えると、上記のコメントの結論に至りました。https://stackoverflow.com/questions/19362113/dapper-and-varchars – Joe
正しいタイプのパラメータ(例:varchar/nvarchar)を定義するストアドプロシージャが使用されている場合は、 DbStringは必要ありません。それが正しいか? – Pingpong