C# InvalidCastException:指定的强制转换无效?

C# InvalidCastException:指定的强制转换无效?,c#,class,doubly-linked-list,C#,Class,Doubly Linked List,我有一个应用程序,它连接到数据库并检索给定AccountNo(表中的一个字段)的信息(从一个名为“Transactions”的表中)。然后,它将检索到的信息放入名为“Transaction”的类的实例中。然后从该类的实例创建一个新节点到一个名为“事务”的预先创建的通用双链接列表中。(如果我的措辞有误,我很抱歉,我对这一切都很陌生) 现在我的问题是,当我尝试将检索到的信息放入类“Transaction”的实例时,我得到一个“InvalidCastException”,它表示“指定的强制转换无效”。

我有一个应用程序,它连接到数据库并检索给定AccountNo(表中的一个字段)的信息(从一个名为“Transactions”的表中)。然后,它将检索到的信息放入名为“Transaction”的类的实例中。然后从该类的实例创建一个新节点到一个名为“事务”的预先创建的通用双链接列表中。(如果我的措辞有误,我很抱歉,我对这一切都很陌生)

现在我的问题是,当我尝试将检索到的信息放入类“Transaction”的实例时,我得到一个“InvalidCastException”,它表示“指定的强制转换无效”。所有的数据类型都是正确的,所以我真的不知道问题出在哪里

这是我的密码

交易类别:

public class Transaction
{
    private int AccountNumber;
    private DateTime Date;
    private string Description;
    private string DebitCredit;
    private float Amount;

    public Transaction(int accountNumber, DateTime date, string description, string debitCredit, float amount)
    {
        this.AccountNumber = accountNumber;
        this.Date = date;
        this.Description = description;
        this.DebitCredit = debitCredit;
        this.Amount = amount;
    }
}
我的代码的其余部分位于按钮单击事件后面(抛出强制转换错误的行两边都有**):

private void按钮1\u单击(对象发送者,事件参数e)
{
LinkedList Transactions=new LinkedList();//创建通用链表
SqlConnection con=new SqlConnection(@“数据源=melss002;初始目录=30001622;集成安全性=True”);//连接字符串
int accNum=Int32.Parse(Microsoft.VisualBasic.Interaction.InputBox(“请输入帐号”、“帐号”);//提示用户输入帐号
SqlCommand cmd=new SqlCommand(“从AccountNo=“+accNum,con)”的事务中选择*;//要执行的命令
con.Open();//打开与数据库的连接
SqlDataReader=cmd.ExecuteReader();
if(reader.HasRows)//检查表是否有记录
{
while(reader.Read())//读取具有给定帐户号的所有记录
{
**Transaction Transaction 001=新事务(reader.GetInt32(0)、reader.GetDateTime(1)、reader.GetString(2)、reader.GetString(3)、reader.GetFloat(4));**//新事务节点
Transactions.AddFirst(Transaction001);//将节点添加到双链接列表(Transactions)
}
}
其他的
{
MessageBox.Show(“未找到记录”);
}
打印节点(事务);
reader.Close();
con.Close();
}

如果表中有空值,则可能发生这种情况。例如,如果amout为null,则无法转换为float。或者它在数据库中是double,而不是float。

如果所有数据类型都正确,您将不会收到此错误消息,它们不是:

如果看这一行,您会显式地告诉读者返回给定数据类型的字段:

Transaction Transaction001 = new Transaction(reader.GetInt32(0), reader.GetDateTime(1), reader.GetString(2), reader.GetString(3), reader.GetFloat(4));

请确保字段0实际上是
Int32
,而不是
Int16
,字段4实际上是
float
,而不是
double
或甚至是
decimal
。在大多数情况下,十进制类型是此类错误的来源,我打赌您的问题可以通过将
GetFloat
更改为
GetDouble

来解决。您调试了代码吗?你确定你的所有
reader.Get..
值对参数类型有效吗?@Kuzgun我确实说过我甚至在我的问题中说了“抛出cast错误的那一行的两边都有**”@SonerGönül我已经调试了我的代码,我确定它们都是正确的数据类型,但我会尝试将Int32更改为Int16。谢谢你的评论!尽量不要转换值并将它们放入
对象
,然后在调试器中检查对象。@Maatt我很确定您只是认为您得到了一个
浮点
,因为在数据库中列类型是
浮点
——但是SQL中的
浮点
映射到C中的
双精度
。请参阅我在问题评论中发布的链接。问题不在于浮动,因为我确定该字段是浮动。我将尝试将Int32更改为Int16。谢谢你的回答!您应该阅读以下内容:那么SQL中的浮点在VisualStudio中是双精度的?我将GetFloat更改为GetDouble,它很有效,非常感谢@Maattt如果您不确定是否可以在数据类型中设置断点并在“监视”(或“快速监视”)窗口中打开reader变量,它将列出所有数据类型。
Transaction Transaction001 = new Transaction(reader.GetInt32(0), reader.GetDateTime(1), reader.GetString(2), reader.GetString(3), reader.GetFloat(4));