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); } } #endregion
Reason 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.