Frage

Ich habe Probleme mit SQL Server mit einer Verbindung fallen, nachdem ich fallen gelassen haben und neu erstellt eine bestimmte Datenbank und das nächste Mal, wenn ich versuchen, einen Befehl für eine neue Verbindung auf derselben Datenbank auszuführen, erhalte ich:

  

Ein Übertragungsfehler aufgetreten ist, wenn die Anfrage an den Server sendet. (Anbieter: Shared Memory-Anbieter, Fehler:. 0 - Kein Prozess ist am anderen Ende des Rohres)

Hier ist die TCP-Version (Wenn ich versuche, auf einem anderen Server verbinden)

  

Ein Übertragungsfehler aufgetreten ist, wenn die Anfrage an den Server sendet. (Anbieter: TCP-Anbieter, Fehler:. 0 - eine vorhandene Verbindung wurde von dem Remotehost geschlossen wurde)

Hier sind die Schritte, das Problem Repro:

  1. eine Verbindung zu einer Datenbank öffnen und einen SQL-Befehl
  2. execute
  3. Löschen Sie die Datenbank
  4. Re-Erstellen der Datenbank
  5. eine neue Verbindung zu derselben Datenbank öffnen und versuchen, einen Befehl gegen sie auszuführen

Ergebnis: Ich erhalte eine Ausnahme

Hier ist der Code:

using (var conn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=DBNAME;Integrated Security=True"))
{
    conn.Open();
    var cmd = conn.CreateCommand();
    cmd.CommandText = "UPDATE ...";
    cmd.ExecuteNonQuery();
}

string sql = "Alter Database DBNAME set single_user with rollback immediate drop database DBNAME";
var server = new Microsoft.SqlServer.Management.Smo.Server(".");
server.ConnectionContext.ExecuteNonQuery(sql);
server.ConnectionContext.Disconnect();

sql = File.ReadAllText("PathToDotSqlFile..."));
server = new Microsoft.SqlServer.Management.Smo.Server(".");
server.ConnectionContext.ExecuteNonQuery(sql);
server.ConnectionContext.Disconnect();

using (var conn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=WER_CONFIG;Integrated Security=True"))
{
    conn.Open();
    var cmd = conn.CreateCommand();
    cmd.CommandText = "UPDATE ...";
    cmd.ExecuteNonQuery();
}

Der Fehler tritt auf der Linie ‚cmd.ExecuteNonQuery ()‘ am Ende. Es scheint, dass, obwohl ich eine neue Verbindung erschaffe jedes Mal, wenn ich eine Verbindung, SQL Server Spur von etwas hält (oder möglicherweise den ADO.net-Code), wo das nächste Mal, wenn ich für eine Verbindung frage, ist es mir eine gibt, die bereits verwendet wird, oder ist auf der Server-Seite geschlossen. Es erkennt nicht, es wurde vom Server geschlossen (vermutlich wegen der Datenbank es fallen gelassen verbunden ist), bis Sie versuchen, einen anderen Befehl gegen ihn auszuführen.

Beachten Sie, dass, wenn ich den ersten Schritt nicht tun, um die erste Abfrage auszuführen, und ich falle nur die Datenbank neu zu erstellen, und führen Sie einen Befehl, ich diesen Fehler nicht erhalten. Ich denke, dass die ersten Verbindungsaufbau, bevor die Datenbank ist ein wichtiger Teil dieses Fehlers fallen gelassen wird.

Ich habe auch versucht, einen externen Prozess mit der Datenbank löschen und neu erstellen wie folgt:

ProcessStartInfo info = new ProcessStartInfo("sqlcmd.exe", " -e -E -S . -Q \"Alter Database DBNAME set single_user with rollback immediate drop database DBNAME\"");
var p = Process.Start(info);
p.WaitForExit();

info = new ProcessStartInfo("sqlcmd.exe", " -i " + PathToDotSqlFile);
p = Process.Start(info);
p.WaitForExit();

Und das hat nicht geholfen.

Gibt es eine Möglichkeit, ein neues SqlConnection zu schaffen und sicherzustellen, dass es sauber ist und nicht aus einem Pool? Alle anderen Vorschläge, wie dieses Problem zu lösen?

UPDATE:. Mit SqlConnection.ClearPool () hat das Problem zu lösen, aber ich wählte nur mit Pooling = false, die auch funktionierten meine Verbindungszeichenfolge bearbeiten

War es hilfreich?

Lösung

ADO.NET verwaltet automatisch einen Verbindungspool. Wenn Sie auf „Schließen“, um eine Verbindung in Ihrer Anwendung, wird es wieder in den Pool und am Leben gehalten, falls Sie eine Verbindung mit der gleichen Verbindungszeichenfolge anfordern. Dies könnte der Grund, warum Ihre „neue“ Verbindung abgestanden ist.

Sie könnten versuchen, dieses Verhalten zu deaktivieren, indem Sie pooling=false als Parameter an der Verbindungszeichenfolge hinzufügen.

Andere Tipps

Sie wissen nicht, über SQL2008, aber das klingt wie ein Connection-Pooling Problem auf der Anwendungsseite. In den alten Tagen, haben wir „OLEDB Dienstleistungen = -1“, um die Verbindungszeichenfolge Verbindungspooling auszuschalten. Es ist wahrscheinlich ein elegantere Weg, dies jetzt zu tun.

edit: ADO.Net 2.0 scheint eine Clear Funktion des SQLConnection-Objekt hinzugefügt zu haben. ( http: // msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.clearpool(VS.80).aspx ) ich bin sehr daran interessiert zu wissen, ob das funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top