我有一个包含此表的数据库,用于存储消息 它看起来像这个
数据库: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,一旦我登录,它再次加载启动画面,甚至没有显示来自电子邮件的任何通知。我错过了什么?
答案 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());
}
}
这将从您的表中获取与登录用户相关的行。如果该用户在表中有多行,则只会获取其中一行。