SqlDataReader返回不正确的值和类型

时间:2017-01-07 18:47:09

标签: c# sql-server

我想用对象填充List。这些对象包含以下格式的信息:

class record
{
    //klassen variable 
    private string voornaam;
    private string recordtype;
    private decimal gewicht;
    private string datum; 

    public string Voornaam
    {
        get { return voornaam; }
        set { voornaam = value; }
    }
    public string Recordtype
    {
        get { return recordtype; }
        set { recordtype = value; }
    }

    public decimal Gewicht
    {
        get { return gewicht; }
        set { gewicht = value; }
    }
    public string Datum
    {
        get { return datum; }
        set { datum = value; }
    }

这些类将填充来自SQL表的信息。我使用此代码获取信息并填写列表:

public List<record> GetAllRecords()
{          
    List<record> records = new List<record>();
    using (SqlConnection Connection = new SqlConnection(@"Data Source = 
(LocalDB)\MSSQLLocalDB; AttachDbFilename = " + database + "; Integrated Security = True;"))
    {
        Connection.Open();
        SqlCommand cmd = new SqlCommand(@"SELECT * FROM [records]", Connection);
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                string voornaam = reader.GetString(1);
                string oefening = reader.GetString(2);
                decimal gewicht = reader.GetDecimal(3); <--this is the problem
                string datum = reader.GetString(4);
                record Record = new record(voornaam, oefening, gewicht, datum);
                records.Add(Record); 
            }
        }
        Connection.Close();
        return records;
    }
 }

我这样做是为了在窗体中填充所有类信息的列表框。但是这是不可能的,因为我得到错误:无法将“System.Decimal”类型的对象强制转换为“System.String”类型。

我理解错误,我无法在列表中输入小数,因为它必须是一个字符串。但是我的sql表包含一个小数,我的类也有。所以我不能使用ToString()或转换它。我应该使用其他方法,如果是这样的话?

1 个答案:

答案 0 :(得分:4)

SqlDataReader的列是从0开始的,而不是从1开始的,因此您应该检索数据,从第0列开始,而不是从第1列开始

string voornaam = reader.GetString(0);
string oefening = reader.GetString(1);
decimal gewicht = reader.GetDecimal(2);
string datum = reader.GetString(3);

错误消息只是说明了以下内容:您收到的是string列(datum),但您尝试获取decimal