2017-01-07 3 views
2

Я хочу заполнить список объектами. Эти объекты содержат информацию в следующем формате:SqlDataReader возвращает неправильное значение и типы

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; 
    } 
} 

я делаю это, чтобы заполнить ListBox в окне формы со всей информацией о классе. Однако это невозможно, потому что я получаю сообщение об ошибке: Невозможно применить объект типа «System.Decimal» к типу «System.String».

Я понимаю ошибку, я не могу вставить десятичное число в список, потому что это должна быть строка. Но моя таблица sql содержит десятичное число, и мой класс также делает. Поэтому я не могу использовать ToString() или конвертировать его. Должен ли я использовать другой подход, и если да, то как?

+0

Чтобы быть ясным, списки не имеют ничего общего с вашей проблемой, и это не важно, но я считаю, что более подходящий термин для того, что вы называете «classes» - это «объекты». Также в будущем попытайтесь опубликовать весь соответствующий код - конструктор для 'record' отсутствует. Хотя это можно сделать из того, что вы показываете, это не всегда так. – pinkfloydx33

ответ

3

Столбцы вашего 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 столбец (), но вы пытаетесь получить это как decimal

+2

и использование столбцов на основе столбцов в связи с 'SELECT *' задает проблемы. указать имена столбцов или получить доступ к ним по имени. – dlatikay

Смежные вопросы