对于小巧玲珑的我需要建立对传递AnsiString参数的支持.
数据库具有unicode和非unicode字符串,选择正确的参数类型有时至关重要.
特定参数的DbType.String与DbType.AnsiString会严重影响性能.
在短小精悍的我们动态传递参数,例如:
Query<User>("select * from Users where Name=@Name",new {Name = "name"});
我有一个内部地图,说如果我看到typeof(String)我知道将param作为DbType.String传递
但是,我希望我的用户能够表示该字符串应该是一个AnsiString.匿名类不支持属性,因此我需要一个不同的类型.
显然我可以发明一个:
public class AnsiString { private readonly string str; public AnsiString(string str) { this.str = str; } public String Value { get { return str; } } }
哪个会给我干净的API:
Query<User>("select * from Users where Name=@Name",new {Name = new AnsiString("name")});
但是,如果在System.Data或BCL中存在这样的类,为什么要创建一个.
在BCL或System.Data中是否存在类型我可以用作AnsiString的容器,与上面的示例具有相似的语义?
解决方法
在BCL或System.Data中没有这样的类,你必须自己滚动.
我们采用自定义类型,最终提供更细粒度的定制;此测试显示典型用法:
public void TestDbString() { var obj = connection.Query("select datalength(@a) as a,datalength(@b) as b,datalength(@c) as c,datalength(@d) as d,datalength(@e) as e,datalength(@f) as f",new { a = new DbString { Value = "abcde",IsFixedLength = true,Length = 10,IsAnsi = true },b = new DbString { Value = "abcde",IsAnsi = false },c = new DbString { Value = "abcde",IsFixedLength = false,d = new DbString { Value = "abcde",e = new DbString { Value = "abcde",f = new DbString { Value = "abcde",}).First(); ((int)obj.a).IsEqualTo(10); ((int)obj.b).IsEqualTo(20); ((int)obj.c).IsEqualTo(5); ((int)obj.d).IsEqualTo(10); ((int)obj.e).IsEqualTo(5); ((int)obj.f).IsEqualTo(10); }
所以;它支持:
> ansi vs unicode
>固定与动态长度
>在动态长度的情况下,explict vs implicit(如果长度为< = 4000则为4000;否则为“max” - 这样可以保持查询计划的数量正常)
该类型在dapper内可用.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。