C# MySQL zweiten DataReader DataReader in einer while-Schleife
Wie Sie vielleicht schon erraten haben, aus dem Titel bin ich versucht, dies zu tun:
#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
welche Anrufe dieser in der while-Schleife:
#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
Gibt mir einen Fehler in der zweiten code-block (der, der dazu aufgerufen ist, in der while-Schleife) sagen, dass es schon ein datareader-im Zusammenhang mit der Verbindung. Wie werde ich diese zu arbeiten, weil ich sicher bin, dass es einen Weg gibt.
InformationsquelleAutor Dirk | 2012-08-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
2008 Verbindungszeichenfolgen können Sie mehrere aktive Resultsets über
MultipleActiveResultSets=true;
habe ich nicht verwendet mySQL also ich bin mir nicht sicher, aber vielleicht, wenn Sie ein ADO-provider.Ansonsten einfach stellen Sie eine andere Verbindung-nicht re-verwenden Sie das gleiche.
Hat MARS die Arbeit mit MySQL? Ich dachte, es war immer noch spezifisch für SQL Server 2005 und höher. (Habe ich meist nur mehrere verbindungen sowieso, es sei denn, ich wirklich brauchen, um Dinge zu tun, von interleaving Anrufe in der gleichen Transaktion).
Ich glaube nicht, es Tat, aber ein MS user Lesen könnte, diese Frage so deckte ich die base.
Guter Punkt. Oh hai MS-user! Lesen Sie msdn.microsoft.com/en-us/library/h32h3abf%28v=vs.80%29.aspx vor der Verwendung von MARS.
Ich bin nicht mit, dass der mars-Ding, nur die multiple verbindungen:), die 3 extra Zeilen code 🙂
InformationsquelleAutor Hogan
DataReader hält die Verbindung, bis es durchläuft alle seine Aufzeichnungen. Versuchen Sie, diese
Diese Weise die beiden reader nicht teilen, die gleiche Verbindung
Alle Datensätze geladen werden, in
dt
auf einmal und der reader ist kostenlosOk danke 🙂
Dieser Ansatz der laden des DataReader-Ergebnis in einer DataTable praktisch Aussehen für einige kleine Ergebnismenge Szenarien, die ich in laufen. Zum Beispiel, ein top-level "- Client - /Person" - Reihe, die hat dann 0..n child-Zeilen Durchlaufen, wobei "n" in der Regel ist ein "paar", d.h., nicht "Tausende". Wenn jede dieser untergeordneten Zeilen, die möglicherweise bezieht sich auf 0..n zusätzliche Daten von Zeilen in mehreren anderen Tabellen dieser Ansatz nützlich sein würde für das Durchlaufen dieser ersten Ebene untergeordneten Zeilen, ohne das eine Verbindung aufgebaut werden.
InformationsquelleAutor codingbiz
Öffnen Sie eine weitere Verbindung in die Schleife, und es verwenden, um zu erhalten der zweite reader.
Da der loop ist dicht, Sie könnten es vorziehen, öffnen Sie die beiden Anschlüsse in der ersten Methode übergeben, die zweite durch die der aufgerufenen Methode, und schließen Sie beide an das Ende des ersten ("äußeren") - Methode. Es sollte ein kurzes genug Zeit zwischen den anrufen, dass die normale Regel über verbindungen schließen, so bald wie möglich keine Rolle.
wenn es ein single-threaded-console-app, die passt in die verlieren spec "do-db-Zeug, dann ist Ende" (!) dann ist das in Ordnung; es ist nicht etwas, die gemeinsame Nutzung der Verbindung-pool sowieso.
Danke nochmal 🙂
Denken Sie daran, dass es fällt unter die Kategorie der Biege-Regeln, weil es nur eine kleine app, die macht Sachen und nicht zu Ende; "hey, was ist die Skalierbarkeit auswirken, wie wir..." "wer kümmert sich, das Programm beendet wurde, bevor Sie zu Ende, die Frage!" 🙂
In diesem Fall kann man wirklich erstellen möchten, und öffnen Sie die Anschlüsse an den Anfang der Methode, und schließen Sie Sie am Ende (idealerweise mit
using
um sicherzustellen, dass dies geschieht, im Angesicht einer Ausnahme). Threads gleichzeitig der Umgang mit der gleichzeitigen client-verbindungen (wie in der server-app-clients) wird über separate verbindungen (ansonsten bekommen Sie die gleichen Ausnahme wie oben in einem der clients und weiß nicht, warum) und die Bündelung hält Verbindung overheades und Gesamt-DB-connection-count low als pro stackoverflow.com/a/3845924/400547InformationsquelleAutor Jon Hanna