![](/img/trans.png)
[英]The specified cast from a materialized 'System.Double' type to the 'System.Int32' type is not valid But no Double defined
[英]The specified cast from a materialized 'System.Double' type to the 'System.Single' type is not valid. Can I solve this error
我的项目中有一个DTO课程。 因此,当我在运行时运行时,会显示以下消息:
从实例化的“ System.Double”类型到“ System.Single”类型的指定强制转换无效。
当我仅将float或double类型放入时,会出现此消息。 我映射了DTO类,但错误继续。 用十进制或整数工作正常。 这是我的DTO课程:
public class LiberacaoItensDTO
{
public LiberacaoItensDTO()
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<LiberacaoItensDTO, Liberacao>()
.ForMember(d => d.DataLib, opt => opt.MapFrom(src => Convert.ToDateTime(DataLib)));
cfg.CreateMap<LiberacaoItensDTO, Liberacao>()
.ForMember(d => d.Juros, opt => opt.MapFrom(src => Juros.ToString("C2")));
cfg.CreateMap<LiberacaoItensDTO, Liberacao>()
.ForMember(d => d.Desconto, opt => opt.MapFrom(src => Desconto.ToString("C2")));
cfg.CreateMap<LiberacaoItensDTO, Liberacao>()
.ForMember(d => d.Acrescimo, opt => opt.MapFrom(src => Acrescimo.ToString("C2")));
cfg.CreateMap<LiberacaoItensDTO, Liberacao>()
.ForMember(d => d.Vencimento, opt => opt.MapFrom(src => Convert.ToDateTime(Vencimento)));
cfg.CreateMap<LiberacaoItensDTO, Liberacao>()
.ForMember(d => d.Entrada, opt => opt.MapFrom(src => Entrada.ToString("C2")));
cfg.CreateMap<LiberacaoItensDTO, ItensLib>()
.ForMember(d => d.Qtde, opt => opt.MapFrom(src => Qtde.ToString("C2")));
cfg.CreateMap<LiberacaoItensDTO, ItensLib>()
.ForMember(d => d.Unitario, opt => opt.MapFrom(src => Unitario.ToString("C2")));
cfg.CreateMap<LiberacaoItensDTO, ItensLib>()
.ForMember(d => d.Custo, opt => opt.MapFrom(src => Custo.ToString("C2")));
cfg.CreateMap<LiberacaoItensDTO, ItensLib>()
.ForMember(d => d.CustoDiario, opt => opt.MapFrom(src => CustoDiario.ToString("C2")));
cfg.CreateMap<LiberacaoItensDTO, ItensLib>()
.ForMember(d => d.UltCondicao, opt => opt.MapFrom(src => UltCondicao.ToString("C2")));
cfg.CreateMap<LiberacaoItensDTO, ItensLib>()
.ForMember(d => d.Total, opt => opt.MapFrom(src => Total.ToString("C2")));
});
}
public int IdLiberacao { get; set; }
[DefaultValue(0)]
public int IdOrcamento { get; set; }
[DefaultValue(0)]
public int IdVendedor { get; set; }
public string Vendedor { get; set; }
public int IdFilial { get; set; }
public string Filial { get; set; }
[DefaultValue(0)]
public float DataLib { get; set; }
public int IdCliente { get; set; }
public string Cliente { get; set; }
public string TipoVenda { get; set; }
[DefaultValue(0)]
public float Juros { get; set; }
[DefaultValue(0)]
public float Desconto { get; set; }
[DefaultValue(0)]
public float Vencimento { get; set; }
[DefaultValue(0)]
public float Acrescimo { get; set; }
[DefaultValue(0)]
public float Entrada { get; set; }
public string Mensagem { get; set; }
public int IdProduto { get; set; }
public string Produto { get; set; }
[DefaultValue(0)]
public float Qtde { get; set; }
[DefaultValue(0)]
public float Unitario { get; set; }
[DefaultValue(0)]
public float Custo { get; set; }
[DefaultValue(0)]
public float CustoDiario { get; set; }
[DefaultValue(0)]
public float UltCondicao { get; set; }
[DefaultValue(0)]
public float Total { get; set; }
}
下面我的方法。 此方法返回DTO对象类型:
public List<LiberacaoItensDTO> getAutoriza(int idorcamento)
{
var lista = contexto.Liberacoes
//.Where(lib => lib.IdOrcamento == idorcamento)
.Join(contexto.ItensLibs, lib => lib.IdOrcamento, itens => itens.IdOrcamento, (lib,itens) => new { lib, itens})
.Where(a => a.lib.IdOrcamento == a.itens.IdOrcamento && a.lib.IdOrcamento == idorcamento)
.Select(libera => new LiberacaoItensDTO
{
TipoVenda = libera.lib.TipoVenda,
IdOrcamento = libera.lib.IdOrcamento,
Juros = libera.lib.Juros != 0 ? libera.lib.Juros : 0,
//Entrada = libera.lib.Entrada != 0 ? libera.lib.Entrada : 0,
//Acrescimo = libera.lib.Acrescimo != 0 ? libera.lib.Acrescimo : 0,
//Desconto = libera.lib.Desconto != 0 ? libera.lib.Desconto : 0,
Mensagem = libera.lib.Mensagem,
//DataLib = libera.lib.DataLib != 0 ? libera.lib.DataLib : 0,
Qtde = libera.itens.Qtde != 0 ? libera.itens.Qtde : 0,
Vendedor = libera.lib.Vendedor,
Cliente = libera.lib.Cliente,
Filial = libera.lib.Filial
}).ToList();
return lista;
}
我的休息服务:
public class LiberacaoController : ApiController
{
AutorizadorContext contexto = new AutorizadorContext();
PedidoLiberacao liberacao = new PedidoLiberacao();
[AcceptVerbs("Get")]
public IEnumerable<LiberacaoItensDTO> getLiberacao()
{
return liberacao.getAutoriza(1000012093).AsEnumerable().ToList();
}
}
如果我对此行发表评论Juros = libera.lib.Juros != 0 ? libera.lib.Juros : 0,
Juros = libera.lib.Juros != 0 ? libera.lib.Juros : 0,
或其他带float字段的文件,工作正常。 否则不行。
我也遇到了这个错误,并且在类中有float字段(例如您的DTO类)
public class ReportArchiveHistoryQueryModel
{
public DateTime ArchiveDate { get; set; }
public float Energy { get; set; }
}
我有包含浮点列的sql表。当我通过存储过程获取一些数据时,
CREATE PROCEDURE [dbo].[sp_ReportArchiveHistory]
@SmartCounterId VARCHAR(10)
,@StartDate SMALLDATETIME
,@EndDate SMALLDATETIME
AS
SELECT ArchiveDate,Energy FROM Archive
WHERE Archive.SmartCounterId=@SmartCounterId
AND Archive.ArchiveDate>=@StartDate
AND Archive.ArchiveDate<=@EndDate
我在return result.ToList();
收到此错误return result.ToList();
public List<ReportArchiveHistoryQueryModel> ArchiveHistory(short smartCounterId, DateTime startDate,DateTime endDate)
{
var pSmartCounterId = new SqlParameter("SmartCounterId",smartCounterId);
var pStartDate = new SqlParameter("StartDate",startDate);
var pEndDate = new SqlParameter("EndDate ", endDate);
var result = this.Database.SqlQuery<ReportArchiveHistoryQueryModel>("exec dbo.sp_ReportArchiveHistory @SmartCounterId, @StartDate, @EndDate", pSmartCounterId, pStartDate, pEndDate);
return result.ToList();
}
所以我解决了如下问题:
我认为C#无法将float列的数据转换为class的float字段。 因此,我将存储过程中的float数据转换为varchar。
CREATE PROCEDURE [dbo].[sp_ReportArchiveHistory]
@SmartCounterId VARCHAR(10)
,@StartDate SMALLDATETIME
,@EndDate SMALLDATETIME
AS
SELECT ArchiveDate,CONVERT(varchar(10), Energy )as Energy FROM Archive
WHERE Archive.SmartCounterId=@SmartCounterId
AND Archive.ArchiveDate>=@StartDate
AND Archive.ArchiveDate<=@EndDate
在我用字符串更改了float字段之后。
我的查询模型:
public class ReportArchiveHistoryQueryModel
{
public DateTime ArchiveDate { get; set; }
public string Energy { get; set; }
}
当我需要浮动时,我再次解析为浮动。
ReportArchiveHistoryBusinessModel reportArchiveHistoryBusinessModel=new ReportArchiveHistoryBusinessModel();
reportArchiveHistoryBusinessModel.ArchiveDate = item.ArchiveDate;
reportArchiveHistoryBusinessModel.Energy = float.Parse(item.Energy);
或第二个解决方案:
只是我将float字段更改为double :)
public class ReportArchiveHistoryQueryModel
{
public DateTime ArchiveDate { get; set; }
public double Energy { get; set; }
}
我解决了将所有float和double字段都更改为DTO类中的字符串,在我的App中,我再次更改为float和double。
如果在数据库端数据类型包含float,则在代码端将double映射。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.