private void run() { while (m_Continue) { try { m_Connection = new MySqlConnection(m_ConnStr); m_Connection.Open(); SetCodePage(m_Connection); while (m_Continue) { if (m_RunnersToUpdate.Count > 0) { using (MySqlCommand cmd = m_Connection.CreateCommand()) { Runner r = m_RunnersToUpdate[0]; if (r.RunnerUpdated) { cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("?compid", m_CompID); cmd.Parameters.AddWithValue("?name", r.Name); cmd.Parameters.AddWithValue("?club", r.Club); cmd.Parameters.AddWithValue("?class", r.Class); cmd.Parameters.AddWithValue("?id", r.ID); cmd.CommandText = "REPLACE INTO Runners VALUES (?compid,?name,?club,?class,0,?id)"; try { cmd.ExecuteNonQuery(); } catch (Exception ee) { //Move failing runner last m_RunnersToUpdate.Add(r); m_RunnersToUpdate.RemoveAt(0); throw new ApplicationException("Could not add runner (schedule update later) " + r.Name + ", " + r.Club + ", " + r.Class + " to server due to: " + ee.Message, ee); } cmd.Parameters.Clear(); FireLogMsg("Runner " + r.Name + " updated in DB"); r.RunnerUpdated = false; } if (r.ResultUpdated) { cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("?compid", m_CompID); cmd.Parameters.AddWithValue("?id", r.ID); cmd.Parameters.AddWithValue("?time", r.Time); cmd.Parameters.AddWithValue("?status", r.Status); cmd.Parameters.AddWithValue("?extra1", r.Extra1); cmd.Parameters.AddWithValue("?extra2", r.Extra2); cmd.CommandText = "REPLACE INTO Results VALUES(?compid,?id,1000,?time,?status,Now(),?extra1,?extra2)"; cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); FireLogMsg("Runner " + r.Name + "s result updated in DB"); r.ResultUpdated = false; } if (r.StartTimeUpdated) { cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("?compid", m_CompID); cmd.Parameters.AddWithValue("?id", r.ID); cmd.Parameters.AddWithValue("?starttime", r.StartTime); cmd.Parameters.AddWithValue("?status", r.Status); cmd.Parameters.AddWithValue("?extra1", r.Extra1); cmd.Parameters.AddWithValue("?extra2", r.Extra2); //cmd.CommandText = "REPLACE INTO Results VALUES(" + m_CompID + "," + r.ID + ",0," + r.StartTime + "," + r.Status + ",Now())"; cmd.CommandText = "REPLACE INTO Results VALUES(?compid,?id,100,?starttime,?status,Now(),?extra1,?extra2)"; cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); FireLogMsg("Runner " + r.Name + "s starttime updated in DB"); r.StartTimeUpdated = false; } if (r.HasUpdatedSplitTimes()) { List <SplitTime> splitTimes = r.GetUpdatedSplitTimes(); cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("?compid", m_CompID); cmd.Parameters.AddWithValue("?id", r.ID); cmd.Parameters.AddWithValue("?control", -1); cmd.Parameters.AddWithValue("?time", -1); cmd.Parameters.AddWithValue("?extra1", r.Extra1); cmd.Parameters.AddWithValue("?extra2", r.Extra2); foreach (SplitTime t in splitTimes) { cmd.Parameters["?control"].Value = t.Control; cmd.Parameters["?time"].Value = t.Time; cmd.CommandText = "REPLACE INTO Results VALUES(" + m_CompID + "," + r.ID + "," + t.Control + "," + t.Time + ",0,Now(),?extra1,?extra2)"; cmd.ExecuteNonQuery(); t.Updated = false; FireLogMsg("Runner " + r.Name + " splittime{" + t.Control + "} updated in DB"); } cmd.Parameters.Clear(); } m_RunnersToUpdate.RemoveAt(0); } } else { System.Threading.Thread.Sleep(100); } } } catch (Exception ee) { FireLogMsg("Error: " + ee.Message + " [" + m_Connection.DataSource + "]"); System.Diagnostics.Debug.Write(ee.Message); System.Threading.Thread.Sleep(1000); } finally { m_Connection.Close(); m_Connection.Dispose(); m_Connection = null; } } }