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