2014-04-27 29 views
0

我有一個關於c#和mysql的問題。我想製作一個連接到本地數據庫的simpel登錄表單。我有連接工作(測試它),但我有一個讀取我的數據,從選擇返回的問題。mysql datareader找不到行c#

我想把一個ID放到一個字符串中,所以我可以顯示它(這只是爲了測試)。現在我已經搜索了很多谷歌,幾乎每個人都有這樣的事情。當我執行它不會給出錯誤,但我的sqldatareader什麼也沒有找到。在第一個,如果我問它是否有任何行,並沒有。

我在做什麼錯?我的用戶名/密碼確實存在於我的數據庫中。

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


namespace eindwerk 
{ 
    public partial class LoginForm : Form 
    { 
    string myConnection = "Server=localhost;Database=mydb;Uid=root;Pwd=root;"; 
    MySqlCommand cmd; 
    MySqlConnection connection; 

    public LoginForm() 
    { 
     InitializeComponent(); 
     connection = new MySqlConnection(myConnection); 

     connection.Open(); 
    } 

    private void loginForm_Load(object sender, EventArgs e) 
    { 
     this.Location = new Point((Screen.PrimaryScreen.WorkingArea.Width - this.Width)/2, 
         (Screen.PrimaryScreen.WorkingArea.Height - this.Height)/2); 
    } 

    private void btnLogin_Click(object sender, EventArgs e) 
    { 

     try 
     { 
      cmd = connection.CreateCommand(); 
      cmd.CommandText = "SELECT idlogin FROM login WHERE (username='@username') AND (password='@password') LIMIT 1;"; 
      cmd.Parameters.AddWithValue("@username", txtbxLoginUsername.Text); 
      cmd.Parameters.AddWithValue("@password", txtbxLoginPassword.Text); 


      MySqlDataReader rdr = cmd.ExecuteReader(); 

      rdr.Read(); 
      if (rdr.HasRows) 
      { 
       while (rdr.Read()) 
       { 
        label1.Text = rdr.GetInt32("idlogin").ToString(); 
       } 
      } 
      else 
      { 
       lblLoginError.Visible = true; 
      } 


      rdr.Close(); 

     } 
     catch { 
      lblLoginError.Text = "Nope"; 
      lblLoginError.Visible = true; 
     } 


    } 
} 

}

+4

顯示您的代碼作爲文本.. –

+0

是的。你應該使用'編輯'按鈕 –

回答

0

你只返回1行,但你調用read()的兩倍。在查看數據之前,您的行已被有效丟棄。

+0

我用read語句刪除了我的同時,它仍然沒有返回任何內容。我是否正確地認爲,首先我閱讀,然後檢查Hasrows? – user3578247

+0

我個人從未使用過HasRows。如果你期望單行,我會做一些像if(rdr.Read()){get values} else {no values} – ESG

1

您正在致電Read()多次。撥打While(Reader.Read())單次,並檢查結果if(rdr.HasRows()){}檢查結果是返回或沒有什麼是響應。

+0

我該如何檢查一次:while(rdr.read())然後我的if函數是否正確? – user3578247

+0

while(rdr.Read())只有在有行時纔會執行,並且它對結果中的每一行都按順序運行。假設你的select命令返回很多行,那麼它將逐個運行在while(rdr.Read())中。 – Adrian

+0

@ user3578247好的方法是先嚐試檢查(rdr.HasRows())是否先調用while(),然後在塊內運行條件(如果是其他代碼)。 – Adrian

0

經過漫長的搜索,我發現問題!在我的sql查詢中,我把用戶名='@用戶名',這就是問題所在。你不能使用單引號!!!。我刪除了引號,它完美地工作。

也就是說你得到whay對谷歌的第三頁上trusthing搜索結果...

感謝所有!

+0

我有類似的問題。從參數中刪除@讓它爲我工作。 – user123456