C#从Microsoft SQL Server读取数据

时间:2017-10-19 20:05:58

标签: c# sql-server

我是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),但异常仍然存在。我无法想象这里有什么问题。

请帮我解决这个问题。谢谢大家

数据库:https://imgur.com/a/gXEKO

enter image description here

4 个答案:

答案 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块中。同时对任何SqlConnectionSqlCommand个实例执行此操作(不需要后一种类型)。
  • 我假设您知道您正在根据查询中返回的序数位置访问所有内容(架构无关紧要),请确保您的select指定列名称并且不要使用*作为列位置如果您更改架构,请更改。
  • 如果您知道值应该或永远不能为null,请确保将架构更改为不接受空值。最佳做法是尽可能地约束架构,以确保其包含的数据的有效值更多。

修改

您似乎不确定在将数据从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[]

注释

答案 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;