2014-02-08 21 views
1

我正在開發一個使用mysql和c#的Windows應用程序。在我的應用程序中有一個登錄頁面,有一個登錄按鈕。當我按下登錄按鈕它不會加載數據庫中的值,並給我以下錯誤:在調用Read之前無效訪問字段()

在調用Read()之前無效嘗試訪問字段。

的Visual Studio表示我下面的代碼錯誤:

connection.Open(); 

string query2 = "SELECT * FROM newregistration where ID='" + id+"'"; 
MySql.Data.MySqlClient.MySqlCommand myCommand2 = new     MySql.Data.MySqlClient.MySqlCommand(query2, connection); 

// First Name Reader 
MySqlDataReader fnamereader = myCommand2.ExecuteReader(); 
fnamereader.Read(); 
Fname = fnamereader.GetString(fnamereader.GetOrdinal("FirstName")); 
fnamereader.Close(); 

// Second Name Reader 
MySqlDataReader snamereader = myCommand2.ExecuteReader(); 
snamereader.Read(); 
Sname = snamereader.GetString(snamereader.GetOrdinal("SecondName")); 
snamereader.Close(); 

// EMAIL ID Reader 
MySqlDataReader emailreader = myCommand2.ExecuteReader(); 
emailreader.Read(); 
EmailID = emailreader.GetString(emailreader.GetOrdinal("EmailID")); 
emailreader.Close(); 
DataSet ds = new DataSet(); 
MyAdapter.Fill(ds); 

if (ds.Tables[0].Rows.Count > 0) 
{ 
    profile windwo = new profile(this.id, this.Fname,this.Sname,this.EmailID); 
    AddUserProfileInformation win = new AddUserProfileInformation(this.id); 
    this.Hide(); 
    windwo.Show(); 
} 
else 
{ 
    MessageBox.Show("Sorry Wrong information entered."); 
} 

connection.Close(); 

請幫我整理出了問題,因爲我是新來的發展。

回答

1

您不需要在sql查詢的每一列都使用一個單獨的MySqlDataReader。只需使用一個MySqlDataReader並讀取其中的所有列值。

看起來,你只需要使用像;

if(fnamereader.Read()) 
{ 
    Fname = fnamereader.GetString(fnamereader.GetOrdinal("FirstName")); 
    Sname = fnamereader.GetString(fnamereader.GetOrdinal("SecondName")); 
    EmailID = fnamereader.GetString(fnamereader.GetOrdinal("EmailID")); 
} 

但更重要的是,您應該始終使用parameterized queries。這種字符串連接對於SQL Injection攻擊是開放的。

string query2 = "SELECT * FROM newregistration where [email protected]"; 
MySqlCommand myCommand2 = new MySqlCommand(query2, connection); 
myCommand2.Parameters.AddWithValue("@id", id); 
0

你並不需要保持各個領域

MySqlDataReader reader = myCommand2.ExecuteReader(); 
    reader.Read(); 
    Fname = reader.GetString(reader.GetOrdinal("FirstName")); 
    Sname = reader.GetString(reader.GetOrdinal("SecondName")); 
    EmailID = reader.GetString(reader.GetOrdinal("EmailID")); 
    reader.Close(); 

之前執行DataReader的一對夫婦的其他東西

  • 請使用參數化的SQL綁定變量 - 不只是將變量連接成sql文本 - 這具有安全性和性能優勢。
  • 在使用之前,您應該檢查reader.Read()的布爾結果
相關問題