Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何用Dapper反序列化DbString_C#_String_Converter_Dapper - Fatal编程技术网

C# 如何用Dapper反序列化DbString

C# 如何用Dapper反序列化DbString,c#,string,converter,dapper,C#,String,Converter,Dapper,当我尝试反序列化包含由DbString表示的字符串的记录时: class Record { public DbString Text {get; set;} } 我犯了一个错误 {“从'System.String'到'Dapper.DbString'的强制转换无效”。} 在这种情况下,我是否误用了DbString?Dapper的想法是将查询结果转换为标准的.net类 “DbString”类型是一个简洁的类,用于以特定的方式指定参数值,它不是“标准的.net”类型 因此,不要试图猜测Dap

当我尝试反序列化包含由
DbString
表示的字符串的记录时:

class Record 
{
  public DbString Text {get; set;}
}
我犯了一个错误

{“从'System.String'到'Dapper.DbString'的强制转换无效”。}


在这种情况下,我是否误用了DbString?

Dapper的想法是将查询结果转换为标准的.net类

“DbString”类型是一个简洁的类,用于以特定的方式指定参数值,它不是“标准的.net”类型

因此,不要试图猜测Dapper可能想要将事物映射到什么类型,您应该从最简单的情况开始,因为Dapper通常只起作用

在你的情况下,你的记录应该是

class Record 
{
    public string Text { get; set; }
}

Dapper将做一些工作来确保处理任何合理的类型转换——例如,如果您的数据库字段是int,那么它将很高兴地将其映射到C#type上的int属性,或者映射到long或short或byte(尽管如果转换到较小的数据类型,则在运行时会出现溢出异常)。总之,Dapper对您很好,并尝试做类型映射的艰苦工作-您通常可以坚持基本原则(string,而不是担心使用DbString),Dapper会帮您解决问题

Dapper的想法是将查询结果转换成标准的.net类

“DbString”类型是一个简洁的类,用于以特定的方式指定参数值,它不是“标准的.net”类型

因此,不要试图猜测Dapper可能想要将事物映射到什么类型,您应该从最简单的情况开始,因为Dapper通常只起作用

在你的情况下,你的记录应该是

class Record 
{
    public string Text { get; set; }
}

Dapper将做一些工作来确保处理任何合理的类型转换——例如,如果您的数据库字段是int,那么它将很高兴地将其映射到C#type上的int属性,或者映射到long或short或byte(尽管如果转换到较小的数据类型,则在运行时会出现溢出异常)。总之,Dapper对您很好,并尝试做类型映射的艰苦工作-您通常可以坚持基本原则(string,而不是担心使用DbString),Dapper会帮您解决问题

如果您需要在read模型中使用DbString(如我的第一个答案的注释中所述),那么您可以选择包括一个从string到DbString的映射器-例如,定义类

public class DbStringTypeHandler : SqlMapper.TypeHandler<DbString>
{
    public override DbString Parse(object value)
    {
        if (value == null)
            return null;
        var dbStringValue = value as DbString;
        if (dbStringValue != null)
            return dbStringValue;
        var stringValue = value as string;
        if (stringValue != null)
            return new DbString { Value = stringValue };
        throw new InvalidCastException("Invalid cast from '" + value.GetType() + "' to '" + typeof(DbString) + "'.");
    }

    public override void SetValue(IDbDataParameter parameter, DbString value)
    {
        parameter.Value = value;
    }
}
公共类DbStringTypeHandler:SqlMapper.TypeHandler
{
公共重写DbString解析(对象值)
{
如果(值==null)
返回null;
var dbStringValue=作为DbString的值;
if(dbStringValue!=null)
返回dbStringValue;
var stringValue=作为字符串的值;
if(stringValue!=null)
返回新的DbString{Value=stringValue};
抛出新的InvalidCastException(“从''+value.GetType()+“'到'+typeof(DbString)+'.'的无效强制转换”);
}
公共覆盖无效设置值(IDbDataParameter参数,DbString值)
{
参数值=值;
}
}
然后打电话

SqlMapper.AddTypeHandler<DbString>(new DbStringTypeHandler());
SqlMapper.AddTypeHandler(新的DbStringTypeHandler());
在执行任何查询之前

现在,“Record”类应该可以很好地作为读取模型和“写入”(即设置参数)模型


我用一个SQL server连接对此进行了测试,我认为无论您正在与哪个数据库交谈,都需要调用“AddTypeHandler”的“SqlMapper”类,但您可能需要根据提供程序稍微调整它。

如果您需要在读取模型中使用DbString(如我第一个答案的注释中所述)然后您可以选择包含一个从string到DbString的映射器-例如,定义类

public class DbStringTypeHandler : SqlMapper.TypeHandler<DbString>
{
    public override DbString Parse(object value)
    {
        if (value == null)
            return null;
        var dbStringValue = value as DbString;
        if (dbStringValue != null)
            return dbStringValue;
        var stringValue = value as string;
        if (stringValue != null)
            return new DbString { Value = stringValue };
        throw new InvalidCastException("Invalid cast from '" + value.GetType() + "' to '" + typeof(DbString) + "'.");
    }

    public override void SetValue(IDbDataParameter parameter, DbString value)
    {
        parameter.Value = value;
    }
}
公共类DbStringTypeHandler:SqlMapper.TypeHandler
{
公共重写DbString解析(对象值)
{
如果(值==null)
返回null;
var dbStringValue=作为DbString的值;
if(dbStringValue!=null)
返回dbStringValue;
var stringValue=作为字符串的值;
if(stringValue!=null)
返回新的DbString{Value=stringValue};
抛出新的InvalidCastException(“从''+value.GetType()+“'到'+typeof(DbString)+'.'的无效强制转换”);
}
公共覆盖无效设置值(IDbDataParameter参数,DbString值)
{
参数值=值;
}
}
然后打电话

SqlMapper.AddTypeHandler<DbString>(new DbStringTypeHandler());
SqlMapper.AddTypeHandler(新的DbStringTypeHandler());
在执行任何查询之前

现在,“Record”类应该可以很好地作为读取模型和“写入”(即设置参数)模型


我使用SQL server连接对此进行了测试,我认为您需要调用“AddTypeHandler”的是“SqlMapper”类无论您正在与哪个数据库交谈,都可能需要根据提供程序稍微调整此设置。

您得出结论的速度有点太快了,我的朋友。首先要提到的是,我们需要读和写。我确实从使用简单字符串开始。但我们使用的是sql anywhere数据提供程序,它将DbParameter.Length设置为-1时引发异常(这与例如OdbcParameter不同,后者工作正常)。因此,我发现通过使用DbString,我可以解决这个问题。此外,我还考虑仅在将DbString传递给写查询时使用它们,但这意味着我必须手动创建参数对象,而不仅仅是传递我的记录。考虑到上述所有因素,如果我能够确认DbString将用作字段类型e、 我可以等待修复。否则,我可能会回到字符串+手动参数对象。你得出结论的速度有点太快了,我的朋友。首先要提到的是,我们需要阅读和写作。我确实开始了