ERRO NíVEL DE TRANSPORTE C# NO SQL SERVER

LUIS.HERRERA 24/02/2023 11:05:53
#501055
Bom dia!

Pelo que identifiquei, quando um usuário com Notebook executar meu sistema e depois desconectar o cabo de rede, passando a usar o Wi-fi ou vice-versa, e executar uma ação no banco, o SQL Server gera o erro a nível de transporte:
Citação:

Um erro no nível de transporte ocorreu ao enviar a solicitação ao servidor. (provider: Provedor TCP, error: 0 - Foi foçado o cancelamento de uma conexão existente pelo host remoto.



Não entendo o porque disso, pois sempre abro e fecho a conexão a cada ação no banco de dados, só se o Windows guarda alguma "coisa" que identifica meu app/usuário na conexão inicial (Ethernet ou Wi-fi) e isso faz o SQL não aceitar e achar falha na segurança pela troca da rede. Ao gerar o erro o usuário é obrigado e fechar e reiniciar meu APP para funcionar na "nova" rede, seja wi-fi ou cabo, após a mudança.

No site da Microsoft achei esse código para detectar a conexão ou não do cabo de rede, porém não sei se isso irá ajudar, já que teria de guardar na primeira execução se o cabo está conectado ou não. E a cada novo acesso ao SQL, testaria se houve alteração para exibir uma mensagem ao usuário de reiniciar o aplicativo pela troca da rede.

 
foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces())
{
if (netInterface.NetworkInterfaceType != NetworkInterfaceType.Ethernet) continue;

if (netInterface.OperationalStatus == OperationalStatus.Up)
MessageBox.Show(netInterface.Name + " Está Operando");
else
MessageBox.Show(netInterface.Name + " Não está operando");
}


Acredito que a troca de rede não deveria obrigar a reinicialização do aplicativo, como ocorre por exemplo nos celulares, onde a troca da rede Wi-fi pela rede de dados do celular, não impede o funcionamento.
C# = Dot.net 3.5 com SQL Server

Alguém já passou por isso ou tem alguma ideia de uma solução eficaz?
GUIMORAES 24/02/2023 15:22:51
#501058
Acontece que o SQL Server, assim como muitos outros bancos de dados, deixam a conexão em pooling, e por este motivo, mesmo que voce conecte/desconecte a cada transação, a conexão permanece no pool. Está é uma forma de garantir que a reconexão na próxima transação seja mais rápida possível, aumentando o desempenho da aplicação.
Voce pode definir na string de conexão se deseja que a conexão permaneça no pool de conexões.

"server=***;database=***;uid=***;pwd=***;pooling=false;max pool size=100"


Essa é a forma mais bruta de resolver essa questão, mas acredito que voce deve revisar as suas chamadas ao banco, priorizando a utilização do bloco using na instancia da sua conexão, desta forma voce irá fazer automaticamente o disposing do objeto.
LUIS.HERRERA 24/02/2023 17:31:56
#501060
Guimoraes entendi.
Não conhecia esse pooling. Vou dar uma estudada. Obrigado.
VERA.PALI 25/02/2023 23:58:36
#501062
É...o pooling tá aí desde os tempos dos dinossauros, a gente é que esquece dele
Faça seu login para responder