gpt4 book ai didi

c# - 如何解决 Dapper System.Data.DataException HResult=0x80131501 InvalidCastException Invalid cast from 'System.String' to 'System.Uri'

转载 作者:行者123 更新时间:2023-12-03 18:36:50 27 4
gpt4 key购买 nike

最近,我重构了一些代码,导致从 System.String 更改实体的某些属性的类型。至 System.URI .相关属性的名称包含子字符串 URI 或 URL 和 SonarLint静态代码分析器建议重构代码以使用 System.URI输入而不是 System.String对于这些属性,这在我们的解决方案中是有意义的。

在这个项目中,我们利用了 StackExchange 的 Dapper作为一个超快速和轻量级的对象映射器,但在重构之后,我在尝试从我的存储库中检索数据时开始收到此错误:

System.Data.DataException
HResult=0x80131501
Message=Error parsing column 5 (RequestUrl=https://www.myurl.com/api/wow - String)
Source=Dapper
StackTrace:
at Dapper.SqlMapper.ThrowDataException(Exception ex, Int32 index, IDataReader reader, Object value) in C:\projects\dapper\Dapper\SqlMapper.cs:line 3609
at Dapper.SqlMapper.<>c__DisplayClass156_0`8.<GenerateMapper>b__1(IDataReader r) in C:\projects\dapper\Dapper\SqlMapper.cs:line 1544
at Dapper.SqlMapper.<MultiMapImpl>d__153`8.MoveNext() in C:\projects\dapper\Dapper\SqlMapper.cs:line 1444
at System.Collections.Generic.List`1.AddEnumerable(IEnumerable`1 enumerable)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Dapper.SqlMapper.<MultiMapAsync>d__52`8.MoveNext() in C:\projects\dapper\Dapper\SqlMapper.Async.cs:line 949
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
at My.Namespace.MyRepository.<GetAllRepositoryMethod>d__2.MoveNext() in C:\dev\repos\myproject\MyRepository.cs:line 59
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at My.Namespace.Program.CallerMethod(Object sender, ElapsedEventArgs e) in C:\dev\repos\myproject\Program.cs:line 109
at System.Timers.Timer.MyTimerCallback(Object state)

Inner Exception 1:
InvalidCastException: Invalid cast from 'System.String' to 'System.Uri'.

我怎样才能解决这个错误?

最佳答案

事实证明,Dapper 很容易扩展,并且通过声明一个简单的类来扩展 SqlMapper.TypeHandler<T> ,你可以在 System.String 之间定义一个映射(TypeHandler)和 System.URI类型并启用 Dapper 来执行转换。

这是该类的样子:

using System;
using System.Data;
using Dapper;

namespace My.Namespace.Data.DatabaseTools
{
public class DapperUriTypeHandler : SqlMapper.TypeHandler<Uri>
{
public override void SetValue(IDbDataParameter parameter, Uri value)
{
parameter.Value = value.ToString();
}

public override Uri Parse(object value)
{
return new Uri((string)value);
}
}
}

一旦你声明了映射,你可以通过调用 SqlMapper.AddTypeHandler 让 Dapper 知道它。方法并提供自定义类型处理程序类的实例作为参数,如下所示:
SqlMapper.AddTypeHandler(new DapperUriTypeHandler());

最好打电话的地方 SqlMapper.AddTypeHandler位于启动配置中的某个位置,以便 Dapper 在执行应用程序或服务的早期就知道类型处理程序。

我希望这可以帮助其他社区成员解决 Dapper 的类似问题,并在 future 快速进行类型转换!

关于c# - 如何解决 Dapper System.Data.DataException HResult=0x80131501 InvalidCastException Invalid cast from 'System.String' to 'System.Uri',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54281057/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com