问题描述
|
我的sql列“价格”数据为float类型。
当我使用“ 0”读入一行并尝试以以下方式访问列值时
reader[\"Price\"]
我遇到了一个编译器错误:\“对于decimal.Parse(string)
的最佳重载方法匹配具有一些无效的参数。\”
我想将此值分配给一个十进制变量,我该怎么做?
我尝试时遇到了上面的编译器错误:
decimal price;
price = decimal.Parse(reader[\"Price\"]);
解决方法
reader[\"Price\"]
的返回类型为object
。要执行您要尝试执行的操作,请使用以下命令:
price = decimal.Parse(reader[\"Price\"].ToString());
但是,如果有微小的变化,您可能会得到无法转换为Decimal的字符串,请考虑使用Decimal.TryParse方法,该方法将使您确定转换是否成功。
编辑
SqlDataReader具有许多不同的GetXXX方法,这些方法使您可以从DataReader的列中检索类型化的数据,而不必首先强制转换为中间类型或从中间类型强制转换。我最初建议您使用SqlDataReader.GetDecimal
,因为我看到要检索的类型是十进制。现在,我看到该数据的SQL数据类型实际上是浮动的,因此我建议您使用SqlDataReader.GetFloat
。我对此进行了测试,并得到了无效的强制转换异常。原因是SQL浮点数与.NET浮点数据类型不兼容。
因此,我在MSDN上检查了SQL Server数据类型及其.NET Framework等效项中的表,发现SQL浮动等效于.NET double。我尝试了“ 9”,并且能够正确地检索数据。由于您想要的是小数,因此您需要强制转换:
price = (decimal)reader.GetDouble(reader.GetOrdinal(\"Price\"));
, decimal.Parse
期望string
作为参数。它从string
中解析出decimal
。
reader[\"Price\"]
是对象,而该对象下的实型将是float
。
失败的原因是因为它无法将对象转换为字符串。
所以你可以做
var price = Convert.ToDecimal(reader[\"Price\"]);
要么
var price = (float)reader[\"Price\"];
如果您确定输入的内容是float
。
, SQL Float是C#中的Double。查看文档。 http://msdn.microsoft.com/en-us/library/ms131092.aspx