Existem propriedades ConnectionTimout e CommandTimeout em 3 objetod da ADO:
Connection, Command e Recordset...
seta elas nos objetos que vc ta usando pra 0...
Agora, isso que voce relatou de as vezes funcionar e as vezes nao,
eu tive um problema parecido em uma rede bastante extensa...
resolvemos o problema colocando algumas switchs como repetidor de sinal entre pontos muito distantes, e instalando um servidor de dominio (Win2k03) configurado de forma a liberar todo o trafego da rede dos cabos que levavam ao SQL Server...
Não sei se esse tipo de solução seria para o seu caso, apenas exemplifique para mostrar que nem sempre é na programação que está a solução para nossos problemas... quando o erro é uma variavel (nao acontece todas as vezes) o melhor a fazer é procurar outros fatores alem do seu programa e do banco de dados...
pense no desenpenho da maquina, no trafego da rede, na quantidade de usuarios conectados, nas suas instalações fisicas (temperatura, umidade, ruido eletromagnetico)...