我有一个带有此表的数据库,用于存储消息 它看起来像这样
数据库:vms2 表:vms_notification
---------------------------------------------------------
|id | user | sender | message | date |
---------------------------------------------------------
|0 | gate| reception | hello i am tesing | 2017 -10-04 |
----------------------------------------------------------
现在这就是表,我创建了一个类,该类应该从数据库中获取消息,并在门口的人登录系统时作为新通知弹出。它是一个 C# winform,所以我希望它检查来自 Mysql 服务器的电子邮件,并在屏幕上创建一个消息框,以便用户在收到新邮件时看到。
我的源代码如下所示
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());
}
}
}
}
}
}
它只是加载启动画面,一旦我登录,它就会再次加载启动画面,甚至不显示来自电子邮件的任何通知。我错过了什么?
最佳答案
首先,您运行一个查询来选择表中的所有行。
其次,运行一个循环来检索所有这些行并仅保存最后一行。最后一个似乎与登录的用户不匹配。
要解决此问题:尝试首先获取用户的登录名,然后运行表单的查询
select * from vms2.vms_notification where user = 'username'
但是使用绑定(bind)变量(类似这样)来避免 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());
}
}
这将从您的表中获取与登录用户相关的一行。如果该用户在表中有多于一行,则只会获取其中一行。
关于c# - 在 C# 中实现 MYSQL 通知系统失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46582887/