2017-10-05 74 views
0

我有一個數據庫,這個表是用來存儲消息 和它看起來像這樣從MySQL在C#實現通知系統失敗

數據庫:VMS2表:vms_notification

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

現在多數民衆贊成在表現在我創建一個類,假設從數據庫中獲取消息,並彈出一個新的通知,如果在門口的人登錄到系統。它是一個C#winform,所以我希望它能檢查來自Mysql服務器的電子郵件,並在屏幕上爲用戶看到一個新郵件後看到的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()); 
        } 
       } 
      } 
     } 
    } 
} 

它只是加載啓動畫面,有一次我登錄,它再次加載的啓動畫面,甚至沒有顯示來自電子郵件不得以任何通知。我錯過了什麼?

回答

0

您首先運行一個查詢來選擇表中的所有行。

其次,你運行一個循環,檢索所有這些行,只保存最後一個。最後一個似乎並不在記錄用戶匹配

要解決這個問題:首先嚐試獲取用戶的登錄名,然後運行該窗體

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

的查詢,但做到這一點使用綁定變量,像這樣,避免小約翰尼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()); 
    } 
} 

這將獲取從有關誰在登錄的用戶的表中的行,如果該用戶在表中有多個行,它會讀取只是其中之一。