【问题标题】:ASP.NET: What is DataReader return type if my sql data type is float?ASP.NET:如果我的 sql 数据类型是浮点数,DataReader 返回类型是什么?
【发布时间】:2011-06-15 05:59:37
【问题描述】:

我的价格列的 SQL 数据是浮点类型。 当我使用DataReader 连续读取并尝试访问列值时

reader["Price"]

我收到一个编译器错误:“decimal.Parse(string) 的最佳重载方法匹配有一些无效参数。”

我想将此值分配给十进制变量,我该怎么做? 我在尝试时遇到了上面的编译器错误:

decimal price;
price = decimal.Parse(reader["Price"]);

【问题讨论】:

    标签: c# .net asp.net string datareader


    【解决方案1】:

    reader["Price"] 的返回类型是 object。要执行您想要执行的操作,请使用以下命令:

    price = decimal.Parse(reader["Price"].ToString()); 
    

    但是,如果有最细微的变化,您最终可能会得到一个无法转换为十进制的字符串,请考虑使用Decimal.TryParse Method,这将允许您确定转换是否成功。

    编辑
    SqlDataReader 有许多不同的 GetXXX 方法,这些方法允许您从 DataReader 中的列中检索类型化数据,而无需先转换为中间类型/从中间类型转换。我最初建议您使用SqlDataReader.GetDecimal,因为我看到您要检索的类型是小数。我现在看到这个数据的 SQL 数据类型实际上是浮点数,所以我建议你使用SqlDataReader.GetFloat。不过,我对此进行了测试,并得到了无效的强制转换异常。原因是 SQL 浮点数与 .NET 浮点数数据类型不兼容。

    所以我检查了 MSDN 上SQL Server Data Types and Their .NET Framework Equivalents 中的表,发现 SQL 浮点数相当于 .NET 双精度。我试过SqlDataReader.GetDouble 并且能够无错误地检索数据。既然你想要一个小数,你需要转换:

    price = (decimal)reader.GetDouble(reader.GetOrdinal("Price"));
    

    【讨论】:

    • 非常感谢。但是如果我使用 GetDecimal 方法,我必须使用整数来访问列,例如 reader.GetDecimal(2)。我不能使用 reader.GetDecimal("Price")。我错了吗?我是这个编程业务的新手。谢谢。
    • @user776676 GetDecimal 的 int 参数指示 DataReader 中从中获取数据的列位置。要按列名引用此列位置(提高代码的可读性,顺便说一句),请使用 DataReader 的 GetOrdinal 方法并将列名传递给它。我更新了我的答案,因为我的 GetDecimal 建议误导了你(我也使用 GetOrdinal 方法显示。
    • 感谢您的澄清。我让它工作。非常感谢您的帮助。
    【解决方案2】:

    decimal.Parse 需要 string 作为参数。它从string 中解析出decimal

    reader["Price"] 是对象,而这个对象下面的真实类型是float

    失败的原因是它不能将对象转换为字符串。

    所以你可以这样做

    var price = Convert.ToDecimal(reader["Price"]);
    

    var price = (float)reader["Price"];
    

    如果你确定你输入的是float

    【讨论】:

      【解决方案3】:

      SQL 浮点数是 C# 中的双精度浮点数。查看文档。 http://msdn.microsoft.com/en-us/library/ms131092.aspx

      【讨论】:

      • Koen 的回答说得很清楚。这是我的使用方法:float x = (float)reader.GetDouble(0)
      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多