การเชื่อมต่อกับ SQL Server ใช้งานได้ในบางครั้ง


101

แอปพลิเคชัน ADO.Net สามารถเชื่อมต่อกับเซิร์ฟเวอร์อื่นบนเครือข่ายท้องถิ่นได้ในบางครั้ง ดูเหมือนจะสุ่มว่าความพยายามในการเชื่อมต่อที่กำหนดสำเร็จหรือล้มเหลว การเชื่อมต่อใช้สตริงการเชื่อมต่อในรูปแบบ:

เซิร์ฟเวอร์ = THESERVER \ TheInstance; Database = TheDatabase; User Id = TheUser; รหัสผ่าน = ThePassword;

ข้อผิดพลาดที่ส่งกลับคือ:

หมดเวลาการเชื่อมต่อหมดอายุ หมดระยะหมดเวลาในขณะที่พยายามใช้การตอบรับการจับมือก่อนเข้าสู่ระบบ
อาจเป็นเพราะการจับมือกันก่อนล็อกอินล้มเหลวหรือเซิร์ฟเวอร์ไม่สามารถตอบกลับได้ทันเวลา
ระยะเวลาที่ใช้ในขณะที่พยายามเชื่อมต่อกับเซิร์ฟเวอร์นี้คือ - [Pre-Login] initialization = 42030; จับมือ = 0;

แอปพลิเคชัน. NET เป็นแอปทดสอบขนาดเล็กที่รันโค้ดต่อไปนี้:

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

TheTableมีขนาดเล็กเพียง 78 แถว

อย่างไรก็ตามในเครื่องเดียวกับที่แอปพลิเคชัน. NET ได้รับข้อผิดพลาดนี้ฉันสามารถเชื่อมต่อกับ THESERVER โดยใช้ SSMS และรหัสผู้ใช้ / รหัสผ่านที่ระบุชื่อในสตริงการเชื่อมต่อ

เหตุใดการเชื่อมต่อจึงล้มเหลวจากแอป ADO.Net แต่ประสบความสำเร็จด้วยข้อมูลรับรองที่เหมือนกันจาก SSMS


1
คุณอาจพบปัญหาที่กล่าวถึงในblogs.msdn.microsoft.com/dataaccesstechnologies/2016/05/07/…
pardeepk

คำตอบ:


94

ปรากฎว่า TCP / IP ถูกเปิดใช้งานสำหรับที่อยู่ IPv4 แต่ไม่ใช่สำหรับที่อยู่ IPv6 ของTHESERVER.

เห็นได้ชัดว่าความพยายามในการเชื่อมต่อบางอย่างลงเอยด้วยการใช้ IPv4 และอื่น ๆ ใช้ IPv6

การเปิดใช้งาน TCP / IP สำหรับ IP ทั้งสองเวอร์ชันช่วยแก้ปัญหาได้

ความจริงที่ว่า SSMS ทำงานได้กลายเป็นเรื่องบังเอิญ (ความพยายามสองสามครั้งแรกน่าจะใช้ IPv4) ความพยายามในการเชื่อมต่อผ่าน SSMS ในภายหลังทำให้เกิดข้อความแสดงข้อผิดพลาดเดียวกัน

ในการเปิดใช้งาน TCP / IP สำหรับที่อยู่ IP เพิ่มเติม:

  • เริ่มตัวจัดการการกำหนดค่าเซิร์ฟเวอร์ Sql
  • เปิดโหนด SQL Server Network Configuration
  • คลิกซ้ายที่ Protocols สำหรับ MYSQLINSTANCE
  • ในบานหน้าต่างด้านขวาคลิกขวา TCP / IP
  • คลิกคุณสมบัติ
  • เลือกแท็บที่อยู่ IP
  • สำหรับที่อยู่ IP ในรายการแต่ละรายการตรวจสอบให้แน่ใจว่า Active และ Enabled ทั้งคู่เป็น Yes

ขอบคุณสิ่งนี้ช่วยแก้ข้อผิดพลาดให้ฉันได้ ที่น่าสนใจคือที่อยู่ IP ทั้งหมดถูกตั้งค่าเป็นปิดใช้งาน (ก่อนหน้านี้ไม่ใช่) คงจะดีถ้ารู้ว่าอะไรทำให้สิ่งเหล่านี้ปิดการใช้งานได้เนื่องจากฉันไม่คิดว่าจะมีการเปลี่ยน config ด้วยตนเองในกรณีของฉัน ...
Matt

ฉันไม่เคยปิดการใช้งานที่อยู่ IPv6 ของฉันด้วยตนเอง ฉันก็สงสัยเหมือนกันว่าพวกเขาปิดการใช้งานได้อย่างไร
เอริคเจ

ฉันไม่สามารถเปิดใช้งาน IPv6 ได้ด้วยเหตุผลบางประการ มันบอกว่าต้องเริ่มบริการใหม่เพื่อให้การเปลี่ยนแปลงมีผล แต่จะไม่คงสถานะเป็น "ใช่" เบาะแสใด ๆ เกี่ยวกับการดำเนินการต่อไป
Salman

5
ฉันไม่แน่ใจว่าแต่ละรายการที่ถูกปิดใช้งานเป็นปัญหาเนื่องจากแท็บโปรโตคอลมีการแทนที่ 'ฟังทั้งหมด' ซึ่งจะบอกให้ SQL รับฟังใน IP ทั้งหมด ดูลิงค์ต่อไปนี้สำหรับเอกสารประกอบ msdn.microsoft.com/en-us/library/dd981060.aspx
ShaneH

2
ฉันเห็นสิ่งนี้ใน Azure ฉันคิดว่า
tofutim

31

ฉันมีข้อผิดพลาดเดียวกันที่เพิ่งเกิดขึ้นซึ่งสอดคล้องกับการอัปเดตของ Microsoft รอบล่าสุดอย่างน่าสงสัย (09/02/2016) ฉันพบว่า SSMS เชื่อมต่อโดยไม่มีปัญหาในขณะที่แอปพลิเคชัน ASP.NET ของฉันส่งคืนข้อผิดพลาด "ช่วงหมดเวลาที่ผ่านไปในขณะที่พยายามใช้การตอบรับการตอบรับการจับมือก่อนเข้าสู่ระบบ"

วิธีแก้ปัญหาสำหรับฉันคือเพิ่มการหมดเวลาการเชื่อมต่อ 30 วินาทีลงในสตริงการเชื่อมต่อเช่น:

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

ในสถานการณ์ของฉันการเชื่อมต่อที่ได้รับผลกระทบเพียงรายการเดียวคือการใช้ความปลอดภัยรวมและฉันแอบอ้างเป็นผู้ใช้ก่อนที่จะเชื่อมต่อการเชื่อมต่ออื่น ๆ ไปยังเซิร์ฟเวอร์เดียวกันโดยใช้การตรวจสอบสิทธิ์ SQL ทำงานได้ดี!

ระบบทดสอบ 2 ระบบ (ไคลเอนต์และเซิร์ฟเวอร์ Sql แยกกัน) ได้รับผลกระทบในเวลาเดียวกันทำให้ฉันสงสัยว่ามีการอัปเดต Microsoft!


ฉันมีปัญหาเดียวกันขอบคุณสำหรับความละเอียด ฉันกำลังเชื่อมต่อโดยใช้การรักษาความปลอดภัยแบบรวมผ่าน VPN และการเพิ่มระยะหมดเวลาการเชื่อมต่อเริ่มต้นจากค่าเริ่มต้น 15 เป็น 30 วินาทีเพื่อแก้ไขปัญหาให้ฉัน
Mark G

1
ฉันมีปัญหากับ SQL 2014 LocalDB หลังจากที่ setup.exe ติดตั้งแอปพลิเคชันใหม่และกระบวนการเริ่มต้นกำลังพยายามสร้างฐานข้อมูลใหม่ การแก้ไขนี้ช่วยฉันจากการถ่มน้ำลาย - ขอบคุณฌอน!
Scott

1
สิ่งนี้ช่วยแก้ปัญหาให้ฉันได้เช่นกัน ในกรณีของฉันฉันกำลังเชื่อมต่อผ่าน VPN และเพิ่มรายการในไฟล์โฮสต์ ปัญหาเกิดขึ้นเฉพาะเมื่อใช้ชื่อโฮสต์ในแอปพลิเคชัน SSMS และ. NET เมื่อใช้ที่อยู่ IP ปัญหาไม่เกิดขึ้น
แดน

ขอบคุณสำหรับคำตอบนี้!
Konrad

17

ฉันแก้ปัญหาเหมือน Eric แต่มีการเปลี่ยนแปลงอื่น ๆ :

  • เริ่มตัวจัดการการกำหนดค่าเซิร์ฟเวอร์ Sql
  • เปิดโหนด SQL Server Network Configuration
  • คลิกซ้ายที่ Protocols สำหรับ MYSQLINSTANCE
  • ในบานหน้าต่างด้านขวาคลิกขวา TCP / IP
  • คลิกคุณสมบัติ
  • เลือกแท็บที่อยู่ IP
  • สำหรับที่อยู่ IP ในรายการแต่ละรายการตรวจสอบให้แน่ใจว่า Active และ Enabled ทั้งคู่เป็น Yes

และ

  • สำหรับที่อยู่ IP แต่ละรายการตรวจสอบให้แน่ใจว่าพอร์ตไดนามิก TCP ว่างเปล่าและพอร์ต TCP = 1433 (หรือพอร์ตอื่น ๆ )
  • เปิดไฟร์วอลล์ windows และตรวจสอบว่าพอร์ตเปิดอยู่ในการเชื่อมต่อขาเข้า

วิธีแก้ปัญหาไม่ได้ผลสำหรับฉัน ฉันมีเซิร์ฟเวอร์ที่มีเว็บไซต์และฐานข้อมูลและปัญหานี้ไม่เคยเกิดขึ้น แต่ฉันพบปัญหานี้เมื่อเว็บเซิร์ฟเวอร์ถูกแยกออกจากเซิร์ฟเวอร์ฐานข้อมูล
Ibrahim Amer

11

ฉันมีปัญหาเดียวกันพยายามเชื่อมต่อกับเซิร์ฟเวอร์ในเครือข่ายท้องถิ่น (ผ่าน VPN) จาก Visual Studio ในขณะที่ตั้งค่าโมเดลข้อมูลเอนทิตี
จัดการเพื่อแก้ปัญหาโดยการตั้งค่าTransparentNetworkIPResolution=falseในสตริงการเชื่อมต่อเท่านั้น ใน VS Add Connection Wizard คุณสามารถค้นหาได้ในแท็บขั้นสูง


3
การตั้งค่าคือ TransparentNetworkIPResolution = False เป็นคุณสมบัติใหม่ของ. NET 4.6.1 และเปิดใช้งานโดยค่าเริ่มต้น การตั้งค่านี้เป็นเท็จจะลบระยะหมดเวลา 500 มิลลิวินาทีที่คุณลักษณะนี้สร้างขึ้น สำหรับข้อมูลเพิ่มเติม: blogs.msdn.microsoft.com/dataaccesstechnologies/2016/05/07/…
Jorriss

ขอบคุณ. ชั่วโมงการวิจัยเกี่ยวกับปัญหานี้ ฉันต้องชอบคำตอบนี้ ความคิดเห็นโดย @Jorriss เป็นประโยชน์มากในการทำความเข้าใจว่าทำไม คุณอาจอัปเดตคำตอบให้มีคำหลักที่ถูกต้องได้ Jorriss มีข้อมูลอ้างอิงที่ถูกต้อง
TravisWhidden

5

ฉันมีปัญหาการจับมือเดียวกันเมื่อเชื่อมต่อกับเซิร์ฟเวอร์ที่โฮสต์

ฉันเปิดเครือข่ายและศูนย์การแบ่งปันและเปิดใช้งาน IPv6 บนการเชื่อมต่อเครือข่ายไร้สายของฉัน

ป้อนคำอธิบายภาพที่นี่


3

ฉันแก้ไขข้อผิดพลาดนี้ใน Windows Server 2012 และ SQL Server 2012 โดยเปิดใช้งาน IPv6 และยกเลิกการปิดกั้นพอร์ตขาเข้า 1433


1
ฉันคิดว่านี่ไม่ใช่คำตอบที่ถูกต้องเนื่องจากคำถามมี "บางครั้งเท่านั้น" พอร์ตที่ถูกบล็อกจะไม่ตอบคำถามเกี่ยวกับเรื่องนี้
Magier

3

ไฟล์ปฏิบัติการของฉันที่สร้างขึ้นโดยใช้. NET Framework 3.5 เริ่มรายงานปัญหาการเชื่อมต่อเหล่านี้ในเวลาประมาณครึ่งหนึ่งหลังจากติดตั้ง Windows Updates บางส่วนเมื่อเร็ว ๆ นี้ (สัปดาห์ของวันที่ 7 ส.ค. 2017)

ความล้มเหลวในการเชื่อมต่อเกิดจาก. NET Framework 4.7 ที่ติดตั้งบนคอมพิวเตอร์เป้าหมาย (การติดตั้ง Windows Updates อัตโนมัติเปิดอยู่) - https://support.microsoft.com/?kbid=3186539

การถอนการติดตั้ง. NET Framework 4.7 แก้ไขปัญหาการเชื่อมต่อ

เห็นได้ชัดว่ามีการเปลี่ยนแปลงอย่างสิ้นเชิงใน. Net Framework 4.6.1 - TransparentNetworkIPResolution การ อัปเดตสตริงการเชื่อมต่อตามบทความยังช่วยแก้ปัญหาโดยไม่จำเป็นต้องย้อนกลับเวอร์ชันของเฟรมเวิร์ก


2

ในกรณีของเราเกิดปัญหาเนื่องจากการกำหนดค่าคลัสเตอร์ความพร้อมใช้งาน เพื่อแก้ปัญหานี้เราต้องตั้งค่าMultiSubnetFailoverเป็น True ในสตริงการเชื่อมต่อ

รายละเอียดเพิ่มเติมเกี่ยวกับMSDN


1

ฉันมีปัญหาเดียวกันจัดการเพื่อแก้ปัญหาโดยเปิด / เปิดใช้งานพอร์ต 1433 และ tcp / ip ในตัวจัดการการกำหนดค่าเซิร์ฟเวอร์ SQL จากนั้นรีสตาร์ทเซิร์ฟเวอร์

ป้อนคำอธิบายภาพที่นี่


1

ในกรณีของฉันเหนือตัวเลือกทั้งหมดมีอยู่แล้ว

แก้ไขได้โดยเพิ่ม Connection Time-out = 30Studio จัดการเซิร์ฟเวอร์ SQL


1

ก่อนที่คุณจะสูญเสียเวลามากขึ้นในการแก้ปัญหาเช่นฉันพยายามเพียงเพื่อรีสตาร์ทเครื่องหน้าต่างของคุณ ทำงานให้ฉันหลังจากใช้โซลูชันอื่น ๆ ทั้งหมด


0

ฉันประสบปัญหานี้เมื่อทำการย้าย SharePoint 2010 ถึง 2013 ฉันสงสัยว่าเนื่องจากเซิร์ฟเวอร์ฐานข้อมูลอยู่อีกด้านหนึ่งของไฟร์วอลล์ซึ่งไม่ได้กำหนดเส้นทาง IP6 ซึ่งขณะนั้นพยายามใช้ IP6 และล้มเหลวเมื่อเชื่อมต่อกับฐานข้อมูล

ฉันคิดว่าปัญหาได้รับการแก้ไขแล้ว ข้อผิดพลาดดูเหมือนจะหยุดลงแล้ว สิ่งที่ฉันทำคือฉันเพียงแค่ปิดใช้งาน IP6 (โดยยกเลิกการเลือก) สำหรับอะแดปเตอร์เครือข่ายบนเซิร์ฟเวอร์ SharePoint


0

ฉันมีปัญหาเดียวกันนี้ แต่ฉันกำลังเชื่อมต่อกับฐานข้อมูลระยะไกลโดยใช้ที่อยู่ IP แบบคงที่ ดังนั้นวิธีแก้ปัญหาข้างต้นจึงไม่สามารถแก้ปัญหาของฉันได้

ฉันไม่สามารถเพิ่มการแมปผู้ใช้ที่เหมาะสมสำหรับการเข้าสู่ระบบความปลอดภัยที่ฉันใช้อยู่ดังนั้นวิธีแก้ปัญหาสำหรับฉันคือเพียงตรวจสอบให้แน่ใจว่าได้ตั้งค่าการตั้งค่าการแมปผู้ใช้เพื่อเข้าถึงฐานข้อมูลของฉัน


0

แก้ไขปัญหานี้โดยการบล็อก / ขึ้นบัญชีดำที่อยู่ IP ที่พยายามบังคับบัญชีผู้ใช้ ตรวจสอบบันทึกการเข้าถึง SQL ของคุณสำหรับการพยายามเข้าสู่ระบบที่ล้มเหลวจำนวนมาก (โดยปกติสำหรับบัญชี "sa")


0

สำหรับฉันปรากฎว่าไฟร์วอลล์ในเซิร์ฟเวอร์ windows บล็อกพอร์ต 1433 ซึ่งเป็นพอร์ตเซิร์ฟเวอร์ sql เริ่มต้น ดังนั้นการเพิ่มกฎขาเข้าเพื่อยอมรับการเชื่อมต่อเหล่านั้นจึงเป็นเคล็ดลับสำหรับฉัน


0

ในกรณีของฉันพารามิเตอร์ที่Persist Security Info=trueมีผู้ใช้และรหัสผ่านในสตริงการเชื่อมต่อทำให้เกิดปัญหา การลบพารามิเตอร์หรือตั้งค่าเพื่อfalseแก้ปัญหา


0

ลองรีสตาร์ท SQL Server อย่างง่ายก่อนที่จะทำอะไรรุนแรง อาจแก้ไขได้ มันทำเพื่อฉัน


0

น่าเสียดายที่ฉันมีปัญหากับ Local SQL Server ที่ติดตั้งภายใน Visual Studio และที่นี่วิธีแก้ปัญหาหลายอย่างไม่ได้ผลสำหรับฉัน สิ่งที่ฉันต้องทำคือรีเซ็ต Visual Studio ของฉันโดยไปที่:

แผงควบคุม> โปรแกรมและคุณสมบัติ> ตัวเปิดการตั้งค่า Visual Studio

และคลิกที่ปุ่มเพิ่มเติมและเลือกซ่อมแซม

หลังจากนั้นฉันก็สามารถเข้าถึง Local SQL Server ของฉันและทำงานกับฐานข้อมูล SQL ในเครื่องได้


0

ฉันมีปัญหาเดียวกันกับที่แก้ไขโดยอัตโนมัติหลังจากการอัปเดต Microsoft windows ครั้งล่าสุดมีใครประสบปัญหาเดียวกันหรือไม่


0

ฉันมีปัญหาที่แน่นอนลองใช้ Soultion หลายครั้งไม่ได้ผลในที่สุดรีสตาร์ทระบบก็ใช้งานได้ดี


0

หากต้องการติดตามข้อผิดพลาด"การหมดเวลาการเชื่อมต่อหมดอายุ"โปรดตรวจสอบว่า:

สำหรับรายละเอียดเพิ่มเติมโปรดตรวจสอบการหมดเวลาการเชื่อมต่อหมดอายุ หมดระยะหมดเวลาในขณะที่พยายามใช้การตอบรับการจับมือก่อนเข้าสู่ระบบ


กรณีใดต่อไปนี้ที่เกี่ยวข้องกับข้อผิดพลาดไม่ต่อเนื่อง
RonJohn

กรุณาแก้ไขเพื่อเปิดเผยความร่วมมือก็ต้อง ขอบคุณ.
Maximillian Laumeister

0

การเพิ่มคำตอบที่นี่แม้จะมีคำตอบที่ยอมรับก่อนหน้านี้ เนื่องจากสถานการณ์ของฉันได้รับการยืนยันว่าเป็น DNS โดยเฉพาะอย่างยิ่งการหมดเวลาของ DNS ระหว่างการจับมือกันก่อนเข้าสู่ระบบ การเปลี่ยนจากชื่อ DNS เป็นที่อยู่ IP (หรือใช้รายการไฟล์โฮสต์) คุณจะข้ามปัญหาไปได้ แม้ว่าจะเสียค่าความละเอียด ip อัตโนมัติก็ตาม

ตัวอย่างเช่นแม้จะตั้งค่าการหมดเวลาของ Connection String เป็น 60 สำหรับหนึ่งนาทีเต็ม แต่ก็ยังคงเกิดขึ้นภายในไม่กี่วินาทีหลังจากพยายาม ซึ่งทำให้เกิดคำถามว่าเหตุใดจึงหมดเวลาก่อนระยะหมดเวลาที่กำหนด DNS

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.