C# MySQL deuxième DataReader dans DataReader boucle while
Comme vous avez pu le deviner à partir du titre suis-je en essayant de le faire:
#region check new nations
private void checknewnations()
{
addtolog("server","Checking for new nations");
string sql = "SELECT * FROM " + variables.tbl_nations + " WHERE nations_new=0";
MySqlCommand cmd = new MySqlCommand(sql, connection);
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
addtolog("mysql",reader["nations_name"].ToString());
int nation_ID = int.Parse(reader["nations_ID"].ToString());
string nation_name = reader["nations_name"].ToString();
string user_ID = reader["nations_user"].ToString();
addnation(nation_ID, nation_name, user_ID);
}
addtolog("server","Finished checking for new nations.");
//connection.Close();
reader.Dispose();
}
#endregion
qui appelle cette dans la boucle while:
#region addnation
private void addnation(int nationIDnot, string nationName, string userID)
{
string nationID = makesixdigits(nationIDnot);
string userName = "";
string sql = "SELECT * FROM " + variables.tbl_users + " WHERE users_ID=" + userID;
MySqlCommand cmd = new MySqlCommand(sql, connection);
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
userName = reader["users_name"].ToString();
}
reader.Dispose();
addtolog("add", "[" + nationID.ToString() + "] " + nationName + " [" + userID + "] " + userName);
}
#endregion
Cela me donne une erreur dans le deuxième bloc de code (celui qui est appelée dans la boucle while) en disant qu'il y a déjà un datareader associé à la connexion. Comment suis-je pour que tout cela fonctionne, parce que je suis sûr qu'il ya un moyen.
OriginalL'auteur Dirk | 2012-08-14
Vous devez vous connecter pour publier un commentaire.
En 2008, les chaînes de connexion, vous pouvez avoir plusieurs ensembles de résultats via
MultipleActiveResultSets=true;
je n'ai pas utilisé mySQL donc je ne suis pas sûr, mais peut-être que si vous utilisez un fournisseur ADO.Sinon, il suffit de faire une autre connexion, veuillez ne pas l'utiliser de nouveau le même.
Ne MARS de travailler avec MySQL? Je pensais que c'était encore spécifiques à sql server 2005 et versions ultérieures. (J'ai surtout juste utiliser plusieurs connexions de toute façon, à moins que j'ai vraiment besoin de faire des trucs de l'entrelacement des appels dans la même transaction).
Je ne pense pas qu'il a fait, mais un MS utilisateur peut lire à cette question, j'ai donc couvert la base.
Bon point. Oh hai MS utilisateur! Lire msdn.microsoft.com/en-us/library/h32h3abf%28v=vs.80%29.aspx avant d'utiliser MARS.
Je ne dis pas que mars truc, juste les multiples connexions 🙂 3 lignes de code supplémentaires 🙂
OriginalL'auteur Hogan
DataReader tient une connexion jusqu'à ce qu'elle parcourt tous ses dossiers. Essayez cette
Cette façon, les deux lecteur ne partagent pas la même connexion
Tous les enregistrements sont chargés dans
dt
à la fois, et le lecteur est libreOk merci 🙂
Cette approche de chargement de la DataReader jeu de résultats dans une DataTable semble à portée de main pour certains petit jeu de résultats différents scénarios. Par exemple, un haut-niveau "Client/Personne sur la ligne", qui a alors 0..n lignes enfants à boucle, où "n" est typiquement un "peu" c'est à dire, pas de "milliers" de personnes. Si chacun de ces lignes enfants potentiellement concerne 0..n lignes de données dans plusieurs autres tableaux, cette approche pourrait être utile pour la lecture en boucle par le biais de ces enfants de premier niveau des lignes sans monopoliser une connexion.
OriginalL'auteur codingbiz
Ouvrir une autre connexion dans la boucle, et l'utiliser pour obtenir le deuxième lecteur.
Étant donné que la boucle est serré, vous préférerez peut-être ouvert à la fois des connexions dans la première méthode, passer la deuxième, par le biais de la méthode appelée, et les fermer à la fin de la première ("externe"). Il faut un laps de temps entre les appels que la règle normale à propos de la fermeture des connexions, dès que possible, ne sera pas question.
si c'est un single-threaded application console qui s'inscrit dans le perdre spec de "faire db trucs, puis à la fin" (!) alors c'est très bien; il n'y a pas autre chose que le partage de la connexion de la piscine, de toute façon.
Merci encore 🙂
Rappelez-vous juste qu'il relève de la catégorie de la flexion des règles parce que c'est juste une petite application qui fait des trucs et n'a pas de fin; "hey quel est l'évolutivité de l'impact de la façon dont nous..." "on s'en fout, le programme s'est terminé avant que vous avez obtenu à la fin de cette question!" 🙂
Dans ce cas, vous vraiment envie de créer et d'ouvrir les connexions au début de la méthode, et les fermer à la fin (idéalement avec
using
pour s'assurer que ce qui se passe dans le visage d'une exception). Threads simultanés traiter avec les clients simultanés (comme dans l'application de serveur de clients) ont des connexions distinctes (sinon vous obtiendrez la même réserve que ci-dessus dans l'un des clients et ne sais pas pourquoi) et la mise en commun continue de connexion overheades et total DB nombre de connexions bas que par stackoverflow.com/a/3845924/400547OriginalL'auteur Jon Hanna