在C#中从MYSQL实现通知系统失败

时间:2017-10-05 10:00:39

标签: c# mysql

我有一个包含此表的数据库,用于存储消息  它看起来像这个

数据库:vms2表:vms_notification

---------------------------------------------------------
|id  | user | sender   |   message         |     date    |
---------------------------------------------------------
|0   | gate| reception | hello i am tesing | 2017 -10-04 |
----------------------------------------------------------

现在就是这个表我创建了一个类,它假设从数据库中获取消息,如果门口的人登录到系统,则弹出为新的通知。它是一个C#winform,所以我希望它从Mysql Server检查电子邮件,并在屏幕上创建一个MessageBox,供用户看到他有一个新邮件。

我的源代码看起来像这样

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MySql.Data;
using MySql.Data.MySqlClient;
using System.Windows.Forms;

namespace VisitorManager2
{
    class Notification
    {
        public void NotifyMessenger()
        {
            string constring = "server=localhost;user id=root;database=vms2";
            using (MySqlConnection con = new MySqlConnection(constring))
            {
                string sql = "select * from vms2.vms_notification";
                using (MySqlCommand cmd = new MySqlCommand(sql, con))
                {
                    con.Open();
                    MySqlDataReader rdr = cmd.ExecuteReader();
                    try
                    {
                        string userid = null;
                        string sender;
                        string message;
                        string date;

                        while (rdr.Read())
                        {
                            userid = (rdr["user"].ToString());
                            sender = (rdr["sender"].ToString());
                            message = (rdr["message"].ToString());
                            date = (rdr["date"].ToString());
                        }

                        Loginform login = new Loginform();
                        string username = login.metroComboBox1.Text;

                        if (userid == username)
                        {
                            MessageBox.Show("New Notification!", "New Notification",MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        }
                    }
                    catch(Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
        }
    }
}

它只是加载Splashscreen,一旦我登录,它再次加载启动画面,甚至没有显示来自电子邮件的任何通知。我错过了什么?

1 个答案:

答案 0 :(得分:0)

首先,您运行一个选择表中所有行的查询。

其次,运行一个循环,检索所有这些行,只保存最后一行。最后一个似乎与登录的用户不匹配。

要解决此问题:首先尝试获取用户的登录名,然后运行表单的查询

   select * from vms2.vms_notification where user = 'username'

但是使用绑定变量这样做,以避免小Johnny Droptables问题(查找)。

con.Open();
...
string userid = null;
string sender;
string message;
string date;

const string sql = 
   "select * from vms2.vms_notification where user = @username;";

using (var cmd = new MySqlCommand(sql, con))
{
   cmd.Parameters.AddWithValue("@username", username); 
   var rdr = cmd.ExecuteReader();
   while (rdr.Read())
   {
      userid = (rdr["user"].ToString());
      sender = (rdr["sender"].ToString());
      message = (rdr["message"].ToString());
      date = (rdr["date"].ToString());
   }
}

这将从您的表中获取与登录用户相关的行。如果该用户在表中有多行,则只会获取其中一行。