Hello guys. I have a method which queries my database 3 times and I was wondering how would I re-write this method to get all the info needed in just ONE query to the database, instead of 3 separate instances?
Here is the method:
#region Background online pilots information do work
private void bgOnlinePilotsInformation_DoWork(object sender, DoWorkEventArgs e)
{
object[] args = e.Argument as object[];
string strSQL = "SELECT * FROM liveacars WHERE vblName = '" + args[0].ToString() + "'";
string strProvider = "Data Source=" + MySQLHost + ";Database=" + MySQLDatabase + ";User ID=" + MySQLUser + ";Password=" + MySQLPassword;
try
{
MySqlConnection mysqlCon = new MySqlConnection(strProvider);
mysqlCon.Open();
if (mysqlCon.State.ToString() == "Open")
{
MySqlCommand mysqlCmd = new MySqlCommand(strSQL, mysqlCon);
MySqlDataReader mysqlReader = mysqlCmd.ExecuteReader();
if (mysqlReader.HasRows)
{
while (mysqlReader.Read())
{
vblOnlinePilotsFlying = mysqlReader.GetString("vblFlightNumber");
vblOnlinePilotsEquipment = mysqlReader.GetString("vblEquipment");
vblOnlinePilotsFlightRoute = mysqlReader.GetString("vblDeparture") + " (" + mysqlReader.GetString("vblDepartureIcao") + ") - " + mysqlReader.GetString("vblArrival") + " (" + mysqlReader.GetString("vblArrivalIcao") + ")";
vblOnlinePilotsAltitude = mysqlReader.GetString("vblAltMsl");
vblOnlinePilotsHeading = mysqlReader.GetString("vblHeadingMagnetic") + "°";
vblOnlinePilotsSpeed = mysqlReader.GetString("vblIas") + " kts";
vblOnlinePilotsStatus = mysqlReader.GetString("vblPhase");
vblOnlinePilotsCarrier = mysqlReader.GetString("vblCarrier");
vblOnlinePilotsLastUpdate = mysqlReader.GetString("last_update");
vblOnlinePilotsLDVersion = mysqlReader.GetString("vblLDVersion");
}
}
else
{
vblOnlinePilotsName = args[0].ToString();
vblOnlinePilotsCarrier = "TBA";
vblOnlinePilotsFlying = "TBA";
vblOnlinePilotsEquipment = "";
vblOnlinePilotsFlightRoute = "TBA";
vblOnlinePilotsAltitude = "0";
vblOnlinePilotsHeading = "TBA";
vblOnlinePilotsSpeed = "TBA";
vblOnlinePilotsStatus = "Pre-flight planning";
vblOnlinePilotsLastUpdate = "TBA";
vblOnlinePilotsLDVersion = "TBA";
}
}
mysqlCon.Close();
}
catch (Exception er)
{
MessageBox.Show("Error Retrieving Pilot Info (1): " + er.Message);
}
string strSQL1 = "SELECT " + UserTable + ".*, " + ProfileTable + ".* FROM " + UserTable + " LEFT JOIN " + ProfileTable + " ON " + UserTable + "." + IdField + " = " + ProfileTable + "." + UserIdField + " WHERE " + UserTable + "." + NameField + " = '" + args[0].ToString() + "'";
try
{
MySqlConnection mysqlCon1 = new MySqlConnection(strProvider);
mysqlCon1.Open();
if (mysqlCon1.State.ToString() == "Open")
{
MySqlCommand mysqlCmd1 = new MySqlCommand(strSQL1, mysqlCon1);
MySqlDataReader mysqlReader1 = mysqlCmd1.ExecuteReader();
while (mysqlReader1.Read())
{
vblOnlinePilotsName = args[0].ToString();
vblOnlinePilotsHours = mysqlReader1.GetString(HoursField);
vblOnlinePilotsFullName = mysqlReader1.GetString(NameField);
}
}
mysqlCon1.Close();
}
catch (Exception er)
{
MessageBox.Show("Error Retrieving Pilot Info (2): " + er.Message);
}
string strSQL2 = "SELECT *, COUNT(*) as rowcount FROM pireps WHERE vblName = '" + args[0].ToString() + "' GROUP BY vblName";
try
{
MySqlConnection mysqlCon2 = new MySqlConnection(strProvider);
mysqlCon2.Open();
if (mysqlCon2.State.ToString() == "Open")
{
MySqlCommand mysqlCmd2 = new MySqlCommand(strSQL2, mysqlCon2);
MySqlDataReader mysqlReader2 = mysqlCmd2.ExecuteReader();
if (mysqlReader2.HasRows)
{
while (mysqlReader2.Read())
{
vblOnlinePilotsLegs = mysqlReader2.GetString("rowcount");
}
}
else
{
vblOnlinePilotsLegs = "0";
vblOnlinePilotsHours = "0";
}
}
mysqlCon2.Close();
}
catch (Exception er)
{
MessageBox.Show("Error Retrieving Pilot Info (3): " + er.Message);
}
}
#endregionReason I am asking is because I think the method is taking too long to complete and it's because of 3 SQL queries. Or is it better to leave it as is?
Thanks in advance for any help.