Peut-être que ce n'est pas la meilleure source que j'ai jamais écrite, mais c'est pour un formulaire simple qui a pour but d'écrire des données à distance. J'ai deux MySQLConnections à la fois pour une base de données locale. localconnection est utilisé pour lire le DB et updateconnection éditer chaque ligne. Le problème est que lorsque j'essaie de mettre à jour la base de données, le programme déclenche un timeout et il plante. Je pense que le problème est généré par le tandis que la boucle. Mon intention est de lire une seule ligne, de la publier sur le serveur et de la mettre à jour si le serveur renvoie l'état 200.MySQL ExecuteNonQuery prend trop de temps
Voici le code, il échoue sur updateConnection.ExcecuteNonQuery();
// Local Database here.
localCommand.Parameters.Clear();
// 0 - Grab unsent emails
string receivedMessages = "SELECT * FROM EMAIL WHERE HASSENT = 0";
// Update connection init START
string updateConnectionString = "Server=" + this.localServer + ";Database=" + this.localDatabase + ";Uid=" + this.localUser + ";Pwd=" + this.localpassword;
MySqlConnection updateConnection = new MySqlConnection(updateConnectionString);
updateConnection.Open();
MySqlTransaction transaction = updateConnection.BeginTransaction();
MySqlCommand updateCommand = new MySqlCommand();
// Update connection init END
localCommand.Connection = localConnection;
localCommand.Prepare();
try
{
localCommand.CommandText = receivedMessages;
MySqlDataReader reader = localCommand.ExecuteReader();
while (reader.Read()) // Local db read
{
String EID = reader.GetString(0);
String message = reader.GetString(3);
String fromEmail = reader.GetString(6);
String toEmail= reader.GetString(12);
// 1 - Post Request via HttpWebRequest
var receivedResponse = JObject.Parse(toSend.setIsReceived(fromEmail, message, toEmail));
// 2 - Read the JSON response from the server
if ((int)receivedResponse["status"] == 200)
{
string updateInbox = "UPDATE EMAIL SET HASSENT = 1 WHERE EMAILID = @EID";
MySqlParameter EMAILID = new MySqlParameter("@EID", MySqlDbType.String);
EMAILID.Value = EID; // We use the same fetched above
updateCommand.Connection = updateConnection;
updateCommand.Parameters.Add(IID_value);
updateCommand.Prepare();
updateCommand.CommandText = updateInbox;
updateCommand.ExecuteNonQuery();
}
else
{
// Notice the error....
}
}
}
catch (MySqlException ex)
{
transaction.Rollback();
// Notice...
}
finally
{
updateConnection.Close();
}
Oui, il semble que le problème est la limite, même si j'ai une requête 35/40 ... peut-être que je dois optimiser le code .. –
Peu importe si vous optimisez ce code; c'est déjà plutôt bien. Votre problème est que vous envoyez chaque enregistrement à un service Web. Les services Web prennent un temps imprévisible pour effectuer leur traitement, il n'y aura donc aucune garantie. Si j'étais vous, je ferais ceux-ci un, deux ou trois à la fois. –