卡在从数据库加载数据

Stuck in loading data from database

在制作这个约会日历时,我想使用访问数据库来保存和检索我的约会。但是,我有不止一种 属性 类型(Strings、Ints、DateTime)和不止一种类型的框(ComboBox、ListBox、DateTimePicker)要显示在 windows 表单中。 我设法使用以下代码(部分)为数据库编写代码:

foreach(var appointment in listOfAppointments)
{
    OleDbCommand DbCommand = new OleDbCommand(
        "INSERT INTO NewAppointmentDatabase " + 
        "([Start], [Length], [DisplayableDescription], [OccursOnDate], [Location], [IsRecurring], [Frequency], [Occurence]) " + 
        "VALUES(@Start, @Length, @DisplayableDescription, @OccursOnDate, @Location, @IsRecurring, @Frequency, @Occurence)", 
        SaveAppntAccess);

    DbCommand.Connection = SaveAppntAccess;


    DbCommand.Parameters.AddWithValue("@Start", appointment.Start);  //is a short time in DateTime
    DbCommand.Parameters.AddWithValue("@Length", appointment.Length); //is an int
    DbCommand.Parameters.AddWithValue("@DisplayableDescription", appointment.DisplayableDescription); //is a long string
    DbCommand.Parameters.AddWithValue("@OccursOnDate", appointment.OccursOnDate(date)); //is a boolean with DateTime as argument
    DbCommand.Parameters.AddWithValue("@Location", appointment.Location); //is a string
    DbCommand.Parameters.AddWithValue("@IsRecurring", appointment.IsRecurring); //is a boolean with yes/no tickbox
    DbCommand.Parameters.AddWithValue("@Frequency", appointment.Frequency); //is a string
    DbCommand.Parameters.AddWithValue("@Occurence", appointment.Occurence); //is an int

我必须注意 appointment.OccursOnDate(date) 中的日期一词在 visual studio 中变红了,这有点奇怪,因为布尔参数是继承的。

然后是棘手的部分:我想加载我的数据!但是我想从数据库中获取我的值并首先将它们分配给每个 属性,然后获取这些值并将它们显示在 ComboBoxes 和 TextBoxes 以及 DateTimePickers.

代码如下(部分):

if(LoadAppntAccess.State == ConnectionState.Open)
{
    OleDbCommand DbCommand = new OleDbCommand(
        "SELECT * FROM NewAppointmentDatabase", LoadAppntAccess);
    OleDbDataReader reader = null;
    DbCommand.Connection = LoadAppntAccess;
    reader = DbCommand.ExecuteReader();

    foreach (var appointment in listofAppointments)
    {
        while (reader.Read())
        {
            //code to complete
        }
    }
}

如何将每个字段的值分配给每个 属性?我在想这样的事情:

appointment.Start.Add(reader["Start"].ToString());
appointment.Length.Add((reader["Length"].ToString());
appointment.DisplayableDescription(reader["DisplayableDescritpion"].ToString());

但我在所有这些方面都遇到了错误 - 正确的语法是什么?

EDIT :我忘了提到 "start" 虽然它被分配为 DateTime,但我用作 ShortTime 值,因为我想要一个带有时间的 ComboBox和 30 分钟的间隔。所以它不完全是一个日期。 OccursOnDate 写成:

public bool OccursOnDate(DateTime date)
{
    return date.Date == date;
}

为了检索日期,我使用了 DateTimePicker

第二次编辑以获取更多信息

我的 class 看起来像这样:

public class Appointment : IAppointment
{
    public DateTime Start { get; set; }
    public int Length { get; set; }
    public string DisplayableDescription { get; set; }
    public bool OccursOnDate(DateTime date)
    {
        return date.Date == date;

    }

    //custom members
    public int ID { get; }
    public string Location { get; set; }
    public bool IsRecurring { get; set; }
    public string Frequency { get; set; }
    public int Occurence { get; set; }


    public Appointment()
    {

    }

但不幸的是,它继承了具有此代码的 IAppointment 的参数。

int ID { get; }

    DateTime Start { get; }
    int Length { get; }
    string DisplayableDescription { get; }
    bool OccursOnDate(DateTime date);

    //custom members
    string Location { get; set; }
    bool IsRecurring { get; set; }
    string Frequency { get; set; }
    int Occurence { get; set; }

自定义成员是我添加的,因为我必须根据规范添加一些额外的东西。

但是我设法根据您在下面的回答找到了语法。

appointment.Start.((DateTime)reader["Start"]);
appointment.Length.((int)reader["Length"]);
appointment.DisplayableDescription.((string)reader["DisplayableDescritpion"]);
appointment.OccursOnDate((DateTime)reader["OccursOnDate"]);
appointment.Location.((string)reader["Location"]);
appointment.IsRecurring.((bool)reader["IsRecurring"]);
appointment.Frequency.((string)reader["Frequency"]);
appointment.Occurence.((int)reader["Occurence"]);

我仍然收到这条消息:

有什么线索吗?

根据你提供的信息,我猜是这样的:

appointment.Start = (DateTime)reader["Start"];
appointment.Length = (int)reader["Length"];
appointment.DisplayableDescription = (string)reader["DisplayableDescritpion"];

这只是一个简单的例子,我们需要更多信息才能给出更好的答案。如果任何列可以有一个空值,你也需要处理它等等。

访问 reader 的列,使用列索引(列索引 0 是 SELECT 子句中的第一列,1 是第二列...等等)。如您所见,调用reader的正确方法来获取适当类型的数据。

appointment.Start = reader.GetDateTime(0);
appointment.Length = reader.GetInt32(1);
appointment.DisplayableDescription= reader.GetString(2);

您还可以通过指定列名来获取数据。

appointment.Start = reader.GetDateTime(reader.GetOrdinal("Start"));
        appointment.Length = reader.GetInt32(reader.GetOrdinal("Length"));
        appointment.DisplayableDescription = reader.GetString(reader.GetOrdinal("DisplayableDescritpion"));

我在评论中 post 发表了评论,但由于没有图片,我没有说清楚,所以我现在 post 我之前的尝试没有奏效,请解释一下。

这是@Nino 和@FsDaniel 都提到的代码

如果您看到接口的参数(在我的初始 post 中),它们只有 get 属性,这使得 Start、Length 和 DisplaybleDescritption 只读。因此错误。其余的没问题,因为他们是我的自定义成员,我给了他们获取和设置属性。我不希望对界面进行任何更改,这就是为什么我要寻找是否可以有其他解决方案的原因。