Koneksi ke SQL Server terkadang berfungsi

100

Aplikasi ADO.Net terkadang hanya dapat terhubung ke server lain di jaringan lokal. Tampaknya acak apakah upaya koneksi tertentu berhasil atau gagal. Koneksi menggunakan koneksi string berupa:

Server = THESERVER \ TheInstance; Database = TheDatabase; User Id = TheUser; Kata Sandi = Kata Sandi;

kesalahan yang dikembalikan adalah:

Connection Timeout Expired. Periode waktu tunggu berlalu saat mencoba menggunakan pengakuan jabat tangan pra-login.
Ini bisa jadi karena handshake pra-login gagal atau server tidak dapat merespons tepat waktu.
Durasi yang dihabiskan ketika mencoba untuk terhubung ke server ini adalah - [Pre-Login] inisialisasi = 42030; jabat tangan = 0;

Aplikasi .NET adalah aplikasi uji kecil yang menjalankan kode berikut:

using (SqlConnection conn = new SqlConnection(cs))
using (SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM TheTable", conn))
{
    conn.Open();
    int rowCount = (int)cmd.ExecuteScalar();
}

Tabel kecil, hanya 78 baris.

Namun, pada mesin yang sama di mana aplikasi .NET menerima kesalahan ini, saya dapat menyambung ke THESERVER menggunakan SSMS dan ID Pengguna / Kata Sandi yang disebutkan dalam string sambungan.

Mengapa koneksi gagal dari aplikasi ADO.Net, tetapi berhasil dengan kredensial identik dari SSMS?

Eric J.
sumber
1
Anda mungkin memukul masalah yang disebutkan dalam blogs.msdn.microsoft.com/dataaccesstechnologies/2016/05/07/...
pardeepk

Jawaban:

92

Ternyata TCP / IP diaktifkan untuk alamat IPv4, tetapi tidak untuk alamat IPv6, dari THESERVER.

Rupanya beberapa upaya koneksi akhirnya menggunakan IPv4 dan yang lainnya menggunakan IPv6.

Mengaktifkan TCP / IP untuk kedua versi IP menyelesaikan masalah.

Fakta bahwa SSMS bekerja ternyata kebetulan (beberapa upaya pertama mungkin menggunakan IPv4). Beberapa upaya selanjutnya untuk menyambung melalui SSMS menghasilkan pesan kesalahan yang sama.

Untuk mengaktifkan TCP / IP untuk alamat IP tambahan:

  • Mulai Manajer Konfigurasi Server Sql
  • Buka konfigurasi jaringan SQL Server node
  • Protokol klik kiri untuk MYSQLINSTANCE
  • Di panel kanan, klik kanan TCP / IP
  • Klik Properties
  • Pilih tab Alamat IP
  • Untuk setiap alamat IP yang terdaftar, pastikan Aktif dan Diaktifkan keduanya Ya.
Eric J.
sumber
Terima kasih, ini menyelesaikan kesalahan untuk saya. Menariknya, semua alamat IP disetel ke nonaktif (sebelumnya tidak). Akan lebih baik untuk mengetahui apa yang dapat menyebabkan ini menjadi dinonaktifkan karena menurut saya konfigurasi tidak akan diubah secara manual dalam kasus saya ...
Matt
Saya juga tidak pernah menonaktifkan alamat IPv6 saya secara manual. Saya juga bertanya-tanya bagaimana mereka akhirnya menjadi cacat.
Eric J.
Saya tidak dapat mengaktifkan IPv6 karena beberapa alasan. Ia mengatakan bahwa layanan perlu direstart agar perubahan diterapkan tetapi tidak pernah mempertahankannya sebagai "Ya". Ada petunjuk tentang cara melakukannya
Salman
5
Saya tidak yakin bahwa entri individu yang dinonaktifkan merupakan masalah karena tab Protokol memiliki timpaan 'dengarkan semua' yang memberi tahu SQL untuk mendengarkan semua IP. Lihat tautan berikut untuk dokumentasi. msdn.microsoft.com/en-us/library/dd981060.aspx
ShaneH
2
Saya melihat hal semacam ini di Azure menurut saya
tofutim
31

Saya telah mengalami kesalahan yang sama yang baru saja muncul yang mencurigakan dengan putaran terbaru pembaruan Microsoft (09/02/2016). Saya menemukan bahwa SSMS terhubung tanpa masalah saat aplikasi ASP.NET saya mengembalikan "periode batas waktu berlalu ketika mencoba untuk menggunakan kesalahan pengakuan jabat tangan pra-masuk"

Solusi bagi saya adalah menambahkan batas waktu koneksi 30 detik ke dalam string koneksi, misalnya:

ConnectionString="Data Source=xyz;Initial Catalog=xyz;Integrated Security=True;Connection Timeout=30;"

Dalam situasi saya, satu-satunya koneksi yang terpengaruh adalah koneksi yang menggunakan Keamanan terintegrasi dan saya meniru identitas pengguna sebelum terhubung, koneksi lain ke server yang sama menggunakan Otentikasi SQL berfungsi dengan baik!

2 sistem pengujian (klien terpisah dan server Sql) terpengaruh pada saat yang sama membuat saya mencurigai pembaruan microsoft!

Shaun Keon
sumber
Saya memiliki masalah yang sama, terima kasih atas resolusinya. Saya terhubung menggunakan keamanan terintegrasi melalui VPN dan meningkatkan batas waktu koneksi default dari default 15 detik menjadi 30 detik menyelesaikan masalah untuk saya.
Mark G
1
Saya mengalami masalah ini dengan SQL 2014 LocalDB setelah setup.exe menginstal aplikasi baru dan proses startup mencoba membuat database baru. Perbaikan ini menyelamatkan saya dari meludahi boneka - terima kasih Shaun!
Scott
1
Ini juga menyelesaikan masalah saya. Dalam kasus saya, saya terhubung melalui VPN dan menambahkan entri di file host. Masalahnya hanya terjadi saat menggunakan nama host di aplikasi SSMS dan .NET. Saat menggunakan alamat IP, masalah tidak terjadi.
Dan
TERIMA KASIH UNTUK JAWABAN INI!
Konrad
17

Saya memecahkan masalah seperti Eric tetapi dengan beberapa perubahan lain:

  • Mulai Manajer Konfigurasi Server Sql
  • Buka konfigurasi jaringan SQL Server node
  • Protokol klik kiri untuk MYSQLINSTANCE
  • Di panel kanan, klik kanan TCP / IP
  • Klik Properties
  • Pilih tab Alamat IP
  • Untuk setiap alamat IP yang terdaftar, pastikan Aktif dan Diaktifkan keduanya Ya.

DAN

  • Untuk setiap alamat IP yang terdaftar, pastikan TCP Dynamic Ports kosong dan TCP Port = 1433 (atau port lain)
  • Buka firewall windows dan periksa apakah port tersebut Terbuka di koneksi masuk
Renzo Ciot
sumber
Solusinya tidak berhasil untuk saya. Saya memiliki server yang berisi situs web dan basis data dan masalah ini tidak pernah terjadi padanya, tetapi saya menemukan masalah ini ketika server web dipisahkan dari server basis data
Ibrahim Amer
11

Saya mengalami masalah yang sama, mencoba menyambung ke server di jaringan lokal (melalui VPN) dari Visual Studio, saat menyiapkan Model Data Entitas.
Berhasil menyelesaikan hanya dengan mengatur TransparentNetworkIPResolution=falsedi string koneksi. Di VS Add Connection Wizard, Anda dapat menemukannya di tab Advanced.

maozx
sumber
3
Pengaturannya adalah TransparentNetworkIPResolution = False. Ini adalah fitur baru pada .NET 4.6.1 dan diaktifkan secara default. Menyetel ini ke false akan menghapus batas waktu 500ms yang dibuat oleh fitur ini. Untuk informasi lebih lanjut: blogs.msdn.microsoft.com/dataaccesstechnologies/2016/05/07/...
Jorriss
Terima kasih. Jam penelitian tentang masalah ini. Saya perlu memfavoritkan tanggapan ini. Komentar oleh @Jorriss sangat membantu memahami alasannya. Anda dapat memperbarui jawaban Anda agar memiliki kata kunci yang benar. Jorriss memiliki referensi yang benar.
TravisWhidden
5

Saya memiliki masalah jabat tangan yang sama saat koneksi ke server yang dihosting.

Saya membuka pusat jaringan dan berbagi saya dan mengaktifkan IPv6 pada koneksi jaringan nirkabel saya.

masukkan deskripsi gambar di sini

Pomster
sumber
3

Eksekusi saya yang dibangun menggunakan .NET Framework 3.5 mulai melaporkan masalah koneksi ini di sekitar setengah dari waktu setelah beberapa Pembaruan Windows diinstal baru-baru ini (minggu 7 Agustus 2017).

Kegagalan sambungan disebabkan oleh .NET Framework 4.7 yang diinstal di komputer target (Penginstalan otomatis Pembaruan Windows aktif) - https://support.microsoft.com/?kbid=3186539

Menghapus instalasi .NETFramework 4.7 memecahkan masalah koneksi.

Rupanya, ada perubahan yang melanggar dalam .Net Framework 4.6.1 - TransparentNetworkIPResolution Memperbarui string koneksi sesuai artikel juga memecahkan masalah tanpa perlu memutar kembali versi kerangka kerja.

pengguna270576
sumber
2

Saya memperbaiki kesalahan ini di Windows Server 2012 dan SQL Server 2012 dengan mengaktifkan IPv6 dan membuka blokir port masuk 1433.

smwikipedia
sumber
1
Saya pikir ini tidak bisa menjadi jawaban yang benar karena pertanyaannya berisi "hanya kadang-kadang". Port yang diblokir tidak akan menjawab pertanyaan tentang ini.
Magier
2

Dalam kasus kami, masalah terjadi karena konfigurasi cluster ketersediaan. Untuk mengatasi masalah ini kami harus mengatur MultiSubnetFailoverke True di string koneksi.

Detail lebih lanjut tentang MSDN

Uriil
sumber
1

Saya memiliki masalah yang sama, berhasil menyelesaikannya dengan membuka / mengaktifkan port 1433 dan tcp / ip di SQL Server Configuration Manager dan kemudian Restart Server

masukkan deskripsi gambar di sini

Myk Agustin
sumber
1

Dalam kasus saya di atas semua opsi sudah ada.

Mengatasinya dengan meningkatkan Connection Time-out = 30.Studio manajemen SQL Server

Jignesh
sumber
1

Sebelum Anda kehilangan lebih banyak waktu untuk memecahkan masalah, seperti saya, coba restart mesin windows Anda . Bekerja untuk saya setelah menerapkan semua solusi lainnya.

tangga rantai
sumber
0

Saya mengalami masalah ini saat melakukan migrasi SharePoint 2010 ke 2013. Saya curiga karena server basis data berada di sisi lain dari firewall yang tidak merutekan IP6 yang kemudian mencoba menggunakan IP6 dan gagal saat menyambung ke basis data.

Saya pikir masalahnya sekarang sudah terpecahkan. Kesalahan tampaknya telah berhenti. Apa yang saya lakukan adalah menonaktifkan IP6 (dengan menghapus centangnya) untuk adaptor jaringan di Server SharePoint.

Chuck Herrington
sumber
0

Saya mengalami masalah yang sama, tetapi saya menghubungkan ke db jarak jauh menggunakan alamat IP statis. Jadi tidak ada solusi di atas yang menyelesaikan masalah saya.

Saya gagal menambahkan Pemetaan Pengguna yang tepat untuk Login keamanan yang saya gunakan, jadi solusi bagi saya adalah memastikan pengaturan Pemetaan Pengguna diatur untuk mengakses database saya.

John Livermore
sumber
0

Memecahkan masalah ini dengan memblokir / memasukkan alamat IP ke daftar hitam yang mencoba memaksa akun pengguna. Periksa log akses SQL Anda untuk sejumlah besar upaya login yang gagal (biasanya untuk akun 'sa').

pengguna3424480
sumber
0

Bagi saya, ternyata firewall di windows server memblokir port 1433 yang merupakan port default sql server. Jadi menambahkan aturan masuk untuk menerima koneksi tersebut membuat trik bagi saya.

Josué Zatarain Espinosa
sumber
0

Dalam kasus saya, parameter Persist Security Info=truedengan pengguna dan kata sandi dalam string koneksi menyebabkan masalah. Menghapus parameter atau mengatur untuk falsememecahkan masalah.

Ricardo Fontana
sumber
0

Coba restart SQL Server sederhana terlebih dahulu sebelum melakukan sesuatu yang drastis. Mungkin memperbaikinya. Itu untuk saya

Robert Benyi
sumber
0

Sayangnya, saya mengalami masalah dengan SQL Server Lokal yang diinstal dalam Visual Studio dan di sini banyak solusi tidak berhasil untuk saya. Yang harus saya lakukan adalah mengatur ulang Visual Studio saya, dengan membuka:

Panel Kontrol> Program & Fitur> Peluncur Pengaturan Visual Studio

dan klik tombol Lainnya dan pilih Perbaiki

Setelah itu saya dapat mengakses SQL Server Lokal saya dan bekerja dengan Database SQL lokal.

muhammad tayyab
sumber
0

Saya mengalami masalah yang sama yang secara otomatis teratasi setelah pembaruan Microsoft windows terakhir, apakah ada yang mengalami hal yang sama?

Syed Wahhab
sumber
0

Saya memiliki masalah yang sebenarnya, mencoba beberapa soultion tidak berhasil, terakhir memulai ulang sistem, itu berfungsi dengan baik.

saran
sumber
0

Untuk melacak kesalahan "Connection Timeout expired" , Harap pastikan bahwa:

  • Contoh dari SQL Server Database Engine sudah aktif dan berjalan.
  • Layanan SQL Server Browser sedang berjalan.
  • TCP / IP diaktifkan.
  • Nama server diketik dengan benar.
  • Tidak ada masalah jaringan seperti yang disebutkan di Cara Memeriksa Konektivitas Instans SQL Server dari server aplikasi ke server database
  • Port TCP / IP untuk instance Database Engine tidak diblokir oleh firewall.
  • Klien dan server dikonfigurasi untuk menggunakan protokol jaringan yang sama.

Untuk lebih jelasnya, Silakan periksa Connection Timeout Expired. Periode waktu tunggu berlalu saat mencoba menggunakan pengakuan jabat tangan pra-login

Mohamed
sumber
Manakah dari kasus berikut ini yang berkaitan dengan kesalahan yang terputus-putus?
RonJohn
Harap edit untuk mengungkapkan afiliasi, itu wajib . Terima kasih.
Maximillian Laumeister
0

Menambahkan tanggapan di sini, meskipun jawaban telah diterima sebelumnya. Karena skenario saya dikonfirmasi sebagai DNS. Lebih khusus lagi, batas waktu dns selama jabat tangan pra-login. Dengan mengubah dari nama DNS ke Alamat IP (atau menggunakan entri file Host), Anda melewati masalah. Meskipun dengan biaya kehilangan resolusi ip otomatis.

Misalnya, bahkan dengan nilai batas waktu Connection String yang disetel ke 60 untuk satu menit penuh, itu masih akan terjadi dalam beberapa detik setelah percobaan. Yang membuat orang bertanya mengapa waktu tunggu sebelum periode batas waktu yang ditentukan? DNS.

Barry
sumber