无法将类型为'System.Single'的对象转换为类型'System.Double'。

4

我正在编写一个追踪某些股票的小应用程序,我有一个包含股票数据的数据库,并希望将其输出到 WPF 数据网格中,但我遇到了以下错误:

无法将类型为“System.Single”的对象强制转换为类型“System.Double”

请原谅我的糟糕的编码技能,因为我已经几年没做过这个了。我查看了内部异常,但它只是显示 null。

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            using (AppDbContext db = new AppDbContext())
            {
                StockGrid.ItemsSource = db.LowFloatStocks.ToList();
            }
        }
    }
}

Stock.cs

#region Day 1 Open Variabes

private int stockId;
private string stockTicker;
private double openingPrice;
private double spike;
private double high;
private double low;
private double closingPrice;

private double gainPercent;
private double gapPercent;
private double highPercent;
private double lowPercent;
private double closePercent;

private string greenToRed;
private string redToGreen;
private string closeLessEqualToOpen;
private string closeRed;
private double closeVHigh;
private double closeVOpen;

private string catalyst;
private double stockFloat;
private string dilution;
#endregion


#region Day 2 Open Variables
private double day2Open;
//private decimal day2Spike;
private double day2High;
private double day2Low;
private double day2Close;

private double day2gapPercent;
private double day2highPercent;
private double day2lowPercent;
private double day2ClosePercent;

private string day2GapUp;
private string day2GapDown;
private string day2GreenRed;
private string day2RedGreen;

private string day2CloseLessEqualOpen;
private string day2CloseRed;
private double day2CloseVHigh;
private double day2ClosevOpen;

SQL

CREATE TABLE [dbo].[LowFloatStocks] (
    [Id]                       INT           NOT NULL,
    [Date]                     DATE          NOT NULL,
    [Ticker]                   NCHAR (10)    NOT NULL,
    [ClosingPrice]             REAL          NOT NULL,
    [OpeningPrice]             REAL          NOT NULL,
    [GainPercent]              AS            (round(([High]-[OpeningPrice])/[OpeningPrice],(4))*(100.0)) PERSISTED NOT NULL,
    [GapPercent]               AS            (round(([OpeningPrice]-[ClosingPrice])/[ClosingPrice],(4))*(100.0)) PERSISTED NOT NULL,
    [Spike]                    REAL          NOT NULL,
    [1stSpike%]                AS            (round(([Spike]-[OpeningPrice])/[OpeningPrice],(4))*(100.0)) PERSISTED NOT NULL,
    [High]                     REAL          NOT NULL,
    [HighPercent]              AS            (round(([High]-[ClosingPrice])/[ClosingPrice],(4))*(100.0)) PERSISTED NOT NULL,
    [Low]                      REAL          NOT NULL,
    [LowPercent]               AS            (round(([Low]-[ClosingPrice])/[ClosingPrice],(4))*(100.0)) PERSISTED NOT NULL,
    [1stClose]                 REAL          NOT NULL,
    [ClosePercent]             AS            (round(([1stClose]-[ClosingPrice])/[ClosingPrice],(4))*(100.0)) PERSISTED NOT NULL,
    [greenToRed]               NCHAR (3)     NOT NULL,
    [redToGreen]               NCHAR (3)     NOT NULL,
    [CloseLessEqualToOpen]     NCHAR (3)     NOT NULL,
    [CloseRed]                 NCHAR (3)     NOT NULL,
    [ClosevHigh]               AS            (round(([High]-[1stClose])/[1stClose],(4))*(100)) PERSISTED NOT NULL,
    [ClosevOpen]               AS            (round(([OpeningPrice]-[1stClose])/[OpeningPrice],(4))*(100.0)) PERSISTED NOT NULL,
    [Catalyst]                 NVARCHAR (50) NOT NULL,
    [Float]                    DECIMAL (18)  NOT NULL,
    [Dilution]                 NCHAR (3)     NOT NULL,
    [Day2Open]                 REAL          NOT NULL,
    [day2gapPercent]           AS            (round(([Day2Open]-[1stClose])/[1stClose],(4))*(100.0)) PERSISTED NOT NULL,
    [Day2High]                 REAL          NOT NULL,
    [day2HighPercent]          AS            (round(([Day2High]-[1stClose])/[1stClose],(4))*(100)) PERSISTED NOT NULL,
    [Day2Low]                  REAL          NOT NULL,
    [Day2LowPercent]           AS            (round(([Day2Low]-[1stClose])/[1stClose],(4))*(100.0)) PERSISTED NOT NULL,
    [Day2Close]                REAL          NOT NULL,
    [Day2ClosePercent]         AS            (round(([Day2Close]-[1stClose])/[1stClose],(4))*(100.0)) PERSISTED NOT NULL,
    [Day2GapUp]                NCHAR (3)     NOT NULL,
    [Day2GapDown]              NCHAR (3)     NOT NULL,
    [Day2GreenToRed]           NCHAR (3)     NOT NULL,
    [Day2RedToGreen]           NCHAR (3)     NOT NULL,
    [Day2CloseLessEqualToOpen] NCHAR (3)     NOT NULL,
    [Day2CloseRed]             NCHAR (3)     NOT NULL,
    [Day2ClosevHigh]           AS            (round(([Day2Open]-[Day2High])/[Day2Open],(4))*(100.0)) PERSISTED NOT NULL,
    [Day2ClosevOpen]           AS            (round(([Day2Open]-[Day2Close])/[Day2Open],(4))*(100.0)) PERSISTED NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

请提供一个 [mcve]。 - mjwills
REAL 不是 double。REAL 是 float。 - Legacy Code
为了隔离问题,将您的代码行拆分:首先将数据获取到本地列表中,然后将该列表分配给数据网格。在db-line上仍然发生错误吗? - Hans Kesting
1个回答

7

你需要将所有的DBTypes从REAL更改为FLOAT,或者将你的C#类型从double更改为float

DBType REAL is float in C#
DBType FLOAT is double in C#

当我写 SQL 时,由于某种原因它自动更改了。 - F.OLeary
好的,我把C#类型改成了float,现在它显示“无法将类型为'System.Double'的对象强制转换为类型'System.Single'”。 - F.OLeary
所以你把数据库类型和 C# 类型都改成了 float 吗?你不应该这么做。 - Legacy Code
DBTypes 是 REAL,而 C# 类型是 float,对吗? - F.OLeary
你能展示一下实体并指出异常抛出的具体位置吗?你还有一个DB DECIMAL,你将其分配给了一个double。请看看这个链接:https://learn.microsoft.com/en-ca/dotnet/framework/data/adonet/sql-server-data-type-mappings。请注意,.NET Framework中的“Single”与C#中的“float”是相同的。 - Legacy Code
没问题,我明白了。由于某种原因,当我更新脚本时,它将浮点数更改为实数。 - F.OLeary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接