我是Microsoft SQL Server的新手,我有几行代码:
keys_unsorted
我收到此错误:
System.InvalidCastException:'指定的强制转换无效。'
我确定private void readItem()
{
SqlDataReader reader = command.ExecuteReader();
if (reader.Read())
{
btn.ItemID = reader.GetInt32(0);
btn.ItemName = reader.GetString(1);
btn.ItemPrice = reader.GetInt32(2);
btn.ItemDiscount = reader.GetFloat(3); // Throw exception
itemPanel.Children.Add(btn);
}
}
和ItemDiscount
都是reader.GetFloat(3)
,但异常仍然存在。我无法想象这里有什么问题。
请帮我解决这个问题。谢谢大家
答案 0 :(得分:3)
如果架构允许null
值,您必须检查数据中null
值的存在。您可以使用IsDBNull
using(SqlDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
btn.ItemID = reader.GetInt32(0);
if(!reader.IsDBNull(1))
btn.ItemName = reader.GetString(1);
if(!reader.IsDBNull(2))
btn.ItemPrice = reader.GetInt32(2);
if(!reader.IsDBNull(3))
btn.ItemDiscount = reader.GetFloat(3); // Throw exception
itemPanel.Children.Add(btn);
}
}
SqlDataReader
实例包装在using
块中。同时对任何SqlConnection
和SqlCommand
个实例执行此操作(不需要后一种类型)。*
作为列位置如果您更改架构,请更改。您似乎不确定在将数据从Sql Server读取到c#时应该使用哪些类型。有关Sql类型以及它们映射到的c#类型,请参阅SQL Server Data Type Mappings。在上面定义的模式中,这些类型映射为:
Column Sql Type c# Type
ID int -> int
Name nvarchar -> string
Price int -> int
Discount float* -> Double
Image image* -> byte[]
Description nvarchar -> string
Count nchar -> string / char[]
注释
image
已弃用,以支持varbinary(max)
decimal
而不是float / double,因为它更精确,另请参阅此前的问题Difference between decimal, float and double in .NET? 答案 1 :(得分:1)
您正在按订单阅读数据,请分享您的选择。
因为基于select语句reader.GetFloat(3)可能是描述。
更好的方法是按结果集中的列名或别名获取数据。
答案 2 :(得分:0)
if (reader.Read())
{
if (!reader.IsDBNull(0))
btn.ItemID = (int)reader["ID"];
if (!reader.IsDBNull(1))
btn.ItemName = (string)reader["Name"];
if (!reader.IsDBNull(2))
btn.ItemPrice = (int)reader["Price"];
if (!reader.IsDBNull(3))
btn.ItemDiscount = (float)reader["Discount"];
btn.Style = (Style)TryFindResource("itemLargeButton");
itemPanel.Children.Add(btn);
}
修复我的代码后,异常仍然发生在这里
输出:
System.InvalidCastException: 'Specified cast is not valid.'
答案 3 :(得分:0)
two thing we need to consider when reading data from any source and converting them to native types.
1. Provide named or alias on the source, it facilities to map right columns to right variables.
btn.ItemDiscount = reader["Discount"];
2. Try to validate the input type before conversion something like below in current scenario:
btn.ItemDiscount= Single.TryParse(reader["Discount"], out float discount) ? discount : 0f;