在调用Read()之前无效尝试访问字段

时间:2014-02-08 12:41:03

标签: c# mysql database windows

我正在使用mysql和c#开发一个Windows应用程序。在我的应用程序中,有一个登录页面有一个登录按钮。当我按下登录按钮时,它不会从数据库加载值并给我以下错误:

在调用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();

请帮助我解决问题,因为我不熟悉开发。

2 个答案:

答案 0 :(得分: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 ID=@id";
MySqlCommand myCommand2 = new MySqlCommand(query2, connection);
myCommand2.Parameters.AddWithValue("@id", id);

答案 1 :(得分:0)

您不需要在每个字段

之前继续执行datareader
   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();

其他一些事情

  • 请使用参数化的sql来绑定变量 - 不要只是将变量连接成sql文本 - 这具有安全性和性能优势。
  • 您应该在使用之前检查reader.Read()的布尔结果