#c# #.net #mysql #windows #winforms
#c# #.net #mysql #Windows #winforms
Вопрос:
У меня есть форма, в которой у меня есть пользовательский контроль (для отображения имени участника с указанием даты и времени) и два списка со списком (один — значения cbstatus, такие как (отказано, принимает, выход из системы), а другой — список cbperiod и такие значения, как (сегодня, 7 дней, 30 дней ..) Я показываю имя участника вместе с датой посещения и датой выхода из системы следующим образом ..)
используя следующий запрос
sql = @"SELECT member_Firstname, member_Lastname, member_Postcode,
visit_DateTime, visit_Status, visit_Logout_DateTime, visits.member_Id, visit_AlertMsg
FROM members,visits
WHERE members.member_Id = visits.member_Id
AND members.member_Active LIKE 'y%'";
это работает нормально…..
Я получаю значения, зависящие от значений со списком, подобных этому..
if (cbStatus.Text == "Accepts")
{
sql = " AND visits.visit_Status = 'accepted' ";
}
у меня есть еще два условия, подобные этому…
if (cbStatus.Text == "refusals")
{
sql = blahh blahh blahhhh
}
я получаю значения для выбора cbperiod combobox следующим образом…
if (cbPeriod.Text == "Today")
{
string dtStartString = DateTime.Today.ToString(DataHelper.dateFormat);
sql = string.Format(" AND visits.visit_Date = '{0}'", dtStartString);
}
//here i am comparing the cbstatus value logout and cbperiod text with today to get the member details whose logout datetime is today
if (cbStatus.Text == "Logout" amp;amp; cbPeriod.Text == "Today")
{
string dtStartString = DateTime.Today.ToString("yyyy-MM-dd");
sql = string.Format(" AND DATE(visits.visit_Logout_DateTime) = '{0}'", dtStartString);
}
и у меня есть еще два условия, подобные этому …. для значений в cbstatus и cbperiod
здесь я связываю свои значения с помощью usercontrol….
datatable dt1 = Helper.GetData(sql);
if (dt1 != null)
{
if (dt1.Rows.Count > 0)
{
foreach (DataRow row in dt1.Rows)
{
newItem = new EntryItem();// this is my usercontrol
if (cbStatus.Text != "Logout")
{
DateTime dtTemp = DateTime.Parse(row["visit_DateTime"].ToString()); // here I am showing the data when user not selected the cbstatus text as logout I mean (refusal,..)
but the below function overrides this data ....
if (cbPeriod.Text == "Today") newItem.lblTime.Text = dtTemp.ToString("HH':'mm':'ss");
else newItem.lblTime.Text = dtTemp.ToString("yyyy'-'MM'-'dd' - 'HH':'mm':'ss");
}
if (row["visit_Logout_DateTime"] != DBNull.Value)
{
DateTime dtlogout = DateTime.Parse(row["visit_Logout_DateTime"].ToString());
if (dtlogout != null)
{
if (cbStatus.Text == "Logout" amp;amp; cbPeriod.Text == "Today")
{
newItem.lblTime.Text = dtlogout.ToString("HH':'mm':'ss");
newItem.lblName.Text = row["member_Firstname"].ToString() " " row["member_Lastname"].ToString();
newItem.lblAlertMessage.Text = row["visit_AlertMsg"].ToString();
}
else
newItem.lblTime.Text = dtlogout.ToString("yyyy'-'MM'-'dd' - 'HH':'mm':'ss");
newItem.lblName.Text = row["member_Firstname"].ToString() " " row["member_Lastname"].ToString();
newItem.lblAlertMessage.Text = row["visit_AlertMsg"].ToString();
}
}
newItem.lblName.Text = row["member_Firstname"].ToString() " " row["member_Lastname"].ToString();
newItem.lblAlertMessage.Text = row["visit_AlertMsg"].ToString();
когда я выберу cbstatus.text == logout
, он покажет правильные данные с участниками с датой выхода из системы…
но когда я выбираю cbstatus.text == refusals
.. он показывал данные выхода из системы (участники с logoutdaatetime) .. это неправильно, на самом деле он должен показывать refusal members
с visit_Datetime
как я могу показать оба данные с членами, имеющими logoutdatetime и дату посещения
Примечание: у одного участника есть как logoutdatetime, так и visitdatetime….
и мои данные выглядят так…
firstname lastname postcode status visit_Logout_DateTime visit_datetime
------------- -------- --------- ------- --------------------- ----------------
rob peter hhd344h refused 2011-05-06 12:09:07 2011-05-06 08:09:34
peter chan hy78kjk refused 2011-09-08 12:09:08 2011-05-03 06:09:34
rock sam yudufg3746h refused 2011-08-08 09:08:45
rob peter hhd344h refused 2011-05-10 12:09:07 2011-05-10 08:09:34
Комментарии:
1. кто-нибудь, пожалуйста, поможет в этом …. и, пожалуйста, сообщите мне, если приведенный выше вопрос неясен…
2. Я бы упростил код и использовал хранимые процедуры, у вас много динамического SQL.
3. но я не могу использовать здесь процедуры хранения…..
Ответ №1:
Используйте оператор case в sql. Смотрите следующий пример
sql = @"SELECT member_Firstname, member_Lastname, member_Postcode, visit_DateTime, visit_Status, visit_Logout_DateTime, visits.member_Id, visit_AlertMsg , CustomDateColumn = CASE visit_Status
WHEN 'refused' THEN visit_Datetime
WHEN 'Logout' THEN visit_Logout_DateTime
WHEN ....
End
FROM members,visits WHERE members.member_Id = visits.member_Id AND members.member_Active LIKE 'y%'";
Ответ №2:
Я думаю, вам могут не хватать некоторых скобок вокруг оператора else, который выглядит следующим образом:
else
newItem.lblTime.Text = dtlogout.ToString("yyyy'-'MM'-'dd' - 'HH':'mm':'ss");
newItem.lblName.Text = row["member_Firstname"].ToString() " " row["member_Lastname"].ToString();
newItem.lblAlertMessage.Text = row["visit_AlertMsg"].ToString();
Кроме того, похоже, что первая строка этого блока может быть ответом на вашу проблему. Вы меняете метку на время выхода из системы. Возможно, вы действительно хотите использовать время «посещения»?
Ответ №3:
Я решил свою проблему … вот так….
if (row["visit_Logout_DateTime"] != DBNull.Value || row["visit_DateTime"] == DBNull.Value)
{
if (cbStatus.Text != "Refusals" amp;amp; cbStatus.Text != "Accepts" amp;amp; row["visit_Logout_DateTime"] != DBNull.Value)
{
DateTime dtlogout = DateTime.Parse(row["visit_Logout_DateTime"].ToString());
if (true)
{
if (cbPeriod.Text == "Today")
{
newItem.lblTime.Text = dtlogout.ToString("HH:mm:ss");
newItem.BackColor = Color.Cyan;
}
else
newItem.lblTime.Text = dtlogout.ToString("yyyy'-'MM'-'dd' - 'HH':'mm':'ss");
newItem.lblName.Text = string.Format("{0} {1}", row["member_Firstname"].ToString(), row["member_Lastname"].ToString());
newItem.lblAlertMessage.Text = string.Format("{0} {1}", row["member_EntryMessage"].ToString(), row["visit_AlertMsg"].ToString());
newItem.lblName.Text = string.Format("{0} {1}", row["member_Firstname"].ToString(), row["member_Lastname"].ToString());
newItem.lblAlertMessage.Text = string.Format("{0} {1}", row["member_EntryMessage"].ToString(), row["visit_AlertMsg"].ToString());
newItem.tbHiddenId.Text = row["member_Id"].ToString();
newItem.ID = Convert.ToInt32(row["member_Id"].ToString());
}
}
}
else if (row["visit_Logout_DateTime"] == DBNull.Value || row["visit_DateTime"] != DBNull.Value)
{
DateTime dtTemp = DateTime.Parse(row["visit_DateTime"].ToString());
newItem.lblTime.Text = dtTemp.ToString(cbPeriod.Text == "Today" ? "HH':'mm':'ss" : "yyyy'-'MM'-'dd' - 'HH':'mm':'ss");
newItem.lblName.Text = string.Format("{0} {1}", row["member_Firstname"].ToString(), row["member_Lastname"].ToString());
newItem.lblAlertMessage.Text = string.Format("{0} {1}", row["member_EntryMessage"].ToString(), row["visit_AlertMsg"].ToString());
newItem.tbHiddenId.Text = row["member_Id"].ToString();
newItem.ID = Convert.ToInt32(row["member_Id"].ToString());
}