微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – .Net框架中是否有可用于表示AnsiString的内置类?

对于小巧玲珑的我需要建立对传递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] 举报,一经查实,本站将立刻删除。

相关推荐