卡在从数据库加载数据
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 只读。因此错误。其余的没问题,因为他们是我的自定义成员,我给了他们获取和设置属性。我不希望对界面进行任何更改,这就是为什么我要寻找是否可以有其他解决方案的原因。
在制作这个约会日历时,我想使用访问数据库来保存和检索我的约会。但是,我有不止一种 属性 类型(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 只读。因此错误。其余的没问题,因为他们是我的自定义成员,我给了他们获取和设置属性。我不希望对界面进行任何更改,这就是为什么我要寻找是否可以有其他解决方案的原因。