Ho notato che i miei errori di codice su sqlWrite.ExecuteNonQuery();
dopo l'esecuzione di 200 inseriscono query in un paio di secondi. Ho sempre pensato che lo using
assicurasse che le risorse vengano riutilizzate correttamente e non ci sarà bisogno di fare nulla. Questa è la prima volta che ottengo questo errore e ho avuto a che fare con sql/C# per quasi 3 anni facendo cose diverse.Quando utilizzare SqlConnection.ClearAllPools() in C#
using (SqlConnection varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
{
using (var sqlWrite = new SqlCommand(preparedCommand, varConnection))
{
sqlWrite.Parameters.AddWithValue("@var_agr_fname", var_agr_fname == "" ? (object) DBNull.Value : var_agr_fname);
sqlWrite.ExecuteNonQuery();
}
}
public static SqlConnection sqlConnectOneTime(string varSqlConnectionDetails)
{
var sqlConnection = new SqlConnection(varSqlConnectionDetails);
try
{
sqlConnection.Open();
}
catch
{
DialogResult result = MessageBox.Show(new Form {TopMost = true},
"Błąd połączenia z bazą danych. Czy chcesz spróbować nawiązac połączenie ponownie?",
"Błąd połączenia (000001)",
MessageBoxButtons.YesNo,
MessageBoxIcon.Stop);
if (result == DialogResult.No)
{
if (Application.MessageLoop)
{
Application.Exit(); // Use this since we are a WinForms app
}
else
{
Environment.Exit(1); // Use this since we are a console app
}
}
else
{
sqlConnection = sqlConnectOneTime(varSqlConnectionDetails);
}
}
return sqlConnection;
}
Messaggio di errore: A transport-level error has occurred when sending the request to the server. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)
Considerando consiglio per this error dovrei usare SqlConnection.ClearAllPools();
per assicurarsi che i collegamenti siano reset o scartati in modo corretto. Quindi posso usarlo ma la domanda è dove usarlo e quando? Come sapere se il limite si sta rompendo? Dov'è il limite? a 50/150/200? o dovrei usarlo ogni volta in un ciclo?
Perché non attivare solo un 'SqlConnection' e usarlo esclusivamente? Sembra che tu stia usando qualsiasi thread, quindi questo dovrebbe funzionare senza alcun * hacky * 'SqlConnection.ClearAllPools()'. –
Ho un metodo che riuso usandolo una o più volte. Fa tutto da stabilire una connessione (o usare quella che è già collegata) a restituire la connessione al pool. Questi sono i consigli che ho ricevuto. In questo modo riutilizza sempre la connessione se è aperta e se è chiusa la apro sempre. Non ho mai avuto un problema fino ad ora. Ho pensato/mi è stato detto che il pool di connessione si prenderà cura di esso per me quando uso 'using' :-) Sembra non :-) – MadBoy
@Madboy: Sembra che tu abbia reinventato il Connection-Pool. Riutilizza sempre le connessioni se sono chiuse e non può riutilizzarle se sono aperte. Hai visto anche i link nelle altre domande (non accettato)? http://social.msdn.microsoft.com/Forums/en-US/sqldataaccess/thread/9609559d-f7ce-4bd8-97d0-0003ff7c9c98/ e http://blogs.msdn.com/b/spike/archive/2009/04/16/un-trasporto-level-error-è-accaduto-quando-invio-the-request-to-the-server-provider-tcp-fornitore-error-0-an-esistente-connection-stato-forza -closed-by-the-remote-host.aspx –