ตรวจสอบว่าการเชื่อมต่อ SQL เปิดหรือปิด


102

คุณจะตรวจสอบได้อย่างไรว่าเปิดหรือปิดที่ฉันใช้อยู่

 if (SQLOperator.SQLCONNECTION.State.Equals("Open"))

แม้สถานะจะเป็น "เปิด" ก็ล้มเหลวในการตรวจสอบนี้

คำตอบ:


175

คุณควรใช้SqlConnection.State

เช่น,

using System.Data;

if (myConnection != null && myConnection.State == ConnectionState.Closed)
{
   // do something
   // ...
}

2
+1 เป๊ะ - ใช้SqlConnectionStateenum เป็น enum และไม่เปลี่ยนเป็นสตริง .....
marc_s

4
ควรเพิ่มusing System.Data;ในคำตอบ IMHO ฉันลืมเนมสเปซนี้ (มีusing System.Data.SqlClient) และคิดไม่ออกว่าจะรับConnectionStateเป็นคีย์เวิร์ดได้อย่างไรจนกว่าฉันจะเพิ่มเข้าไป หวังว่านี่จะช่วยใครบางคนได้
vapcguy

จะได้ผลหรือไม่ถ้าเซิร์ฟเวอร์ (หรือบางอย่างระหว่างเครื่องโลคัลกับเซิร์ฟเวอร์) ปิดการเชื่อมต่อ
jpmc26

จะไม่พูดดีกว่าif (myConnection == null || myConnection.State == ConnectionState.Closed) { //Connection is closed } else { //Connection is open in some way }มั้ย? ด้วยวิธีนี้หากการเชื่อมต่อเป็นโมฆะมันจะ "ปิด" ด้วย
Arvo Bowen

52

นี่คือสิ่งที่ฉันใช้:

if (mySQLConnection.State != ConnectionState.Open)
{
    mySQLConnection.Close();
    mySQLConnection.Open();
}

เหตุผลที่ฉันไม่ใช้แค่:

if (mySQLConnection.State == ConnectionState.Closed)
{
    mySQLConnection.Open();
}

เป็นเพราะ ConnectionState สามารถ:

Broken, Connnecting, Executing, Fetching

นอกจาก

Open, Closed

นอกจากนี้ Microsoft ระบุว่าการปิดและเปิดการเชื่อมต่ออีกครั้ง "จะรีเฟรชค่าสถานะ" ดูที่นี่http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.state(v=vs.110).aspx


คุณควรทดสอบว่าmySQLConnection.State != ConnectionState.Open && mySQLConnection.State != ConnectionState.Connectingจะหลีกเลี่ยงการรีเซ็ตด้วยการเชื่อมต่อที่ช้าหรือไม่?
caligari

@caligari ในขณะที่เป็นจริงไม่มีการรับประกันสำหรับ DbConnection ดังนั้นหากการเขียนโปรแกรมไปยัง DbConnection แบบนามธรรมโปรดใช้ความระมัดระวัง
John Zabroski

1
โดยส่วนตัวฉันคิดว่านี่เป็นปัญหาที่คุณแก้ได้โดยหลีกเลี่ยง ฉันอาจเห็นกรณีการใช้งานสำหรับข้อมูลโค้ดนี้ในเลเยอร์แอปพลิเคชันที่มีสถานะ แต่ไม่เคยอยู่บนเว็บ?
John Zabroski

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

มีข้อแม้ที่สำคัญอย่างหนึ่งคือ 1) ด้วย Local Storage ตอนนี้กลายเป็นสิ่งหนึ่งไม่ช้าก็เร็ว (แล้ว?) เว็บแอปที่ใช้ที่เก็บข้อมูลในเครื่องจะใช้ฐานข้อมูลในที่จัดเก็บข้อมูลนั้น ถ้าไม่ตอนนี้พวกเขาจะไปในไม่ช้า อีกอย่างที่นี่คือรหัสของฉันอาจไม่ได้ถูกกำหนดให้ใช้ในแอปพลิเคชันขนาดใหญ่อย่างถูกต้อง โฟกัสหลักของฉันคือการเขียนโปรแกรมแบบฝังดังนั้นฉันจึงยังคงเรียนรู้ทางฝั่งเซิร์ฟเวอร์
therealjumbo

24

เอกสาร. NET ระบุว่า: คุณสมบัติของรัฐ: การรวมกันของค่า ConnectionState ในระดับบิต

ดังนั้นฉันคิดว่าคุณควรตรวจสอบ

!myConnection.State.HasFlag(ConnectionState.Open)

แทน

myConnection.State != ConnectionState.Open

เนื่องจากสถานะสามารถมีหลายแฟล็ก


ฉันสงสัยว่าทำไมถึงเป็น enum กับธง เนื่องจากค่าของรายการปิดของ enum นี้เป็นศูนย์ดังนั้น State.HasFlag (ConnectionState.Close) จะคืนค่าจริงสำหรับค่าใด ๆ สำหรับฉันมันหมายความว่าฉันควรตรวจสอบเป็น "! = ปิด"
Ivan


4
หมายเหตุ: ฉันรู้สึกว่าจำเป็นที่จะต้องพูดถึงว่าลิงก์ของอีวานระบุว่าคุณไม่ควรใช้สิ่งนี้เป็นแฟล็ก ดูคำตอบเฉพาะนี้: stackoverflow.com/a/35484965/2499090
Brent Rittenhouse

9

ตรวจสอบว่าการเชื่อมต่อ MySQL เปิดอยู่หรือไม่

ConnectionState state = connection.State;
if (state == ConnectionState.Open)
{
    return true;
}
else
{
    connection.Open();
    return true;
}

จุดประสงค์ของการกลับมาเป็นจริงเสมอคืออะไร? ณ จุดนี้ทำให้วิธีนี้เป็นโมฆะ ตรวจสอบเฉพาะว่าการเชื่อมต่อไม่ได้เปิดอยู่และหากเปิดไว้ แล้ว ... ทำไมถึงเขียน 2 ครั้งreturn true;? วางไว้ในตอนท้ายของวิธีการนอกif/ else!
Massimiliano Kraus

ในกรณีของปัญหาเครือข่ายสิ่งเหล่านี้จะให้คำตอบที่ผิด คุณไม่สามารถมั่นใจได้ว่าการเปิดจะเปิดขึ้นอย่างแน่นอน
user613326

@ user613326 จริงๆมันจะไม่ ไม่มีการจัดการข้อผิดพลาดในโค้ดตัวอย่างดังนั้นปัญหาใด ๆ ในขณะเชื่อมต่อจะทำให้คุณต้องจัดการกับข้อยกเว้น ค่าที่ส่งกลับจึงถูกต้อง
Tom Lint

6

คุณยังสามารถใช้สิ่งนี้

if (SQLCON.State == ConnectionState.Closed)
{
     SQLCON.Open();
}

1
using System.Data;สำหรับใครก็ตามที่ไม่รู้หรือไม่รู้ว่าทำไมมันถึงใช้ไม่ได้
Coops

5

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

// Defensive database opening logic.

if (_databaseConnection.State == ConnectionState.Broken) {
    _databaseConnection.Close();
}

if (_databaseConnection.State == ConnectionState.Closed) {
    _databaseConnection.Open();
}

เป็นเพียงการป้องกันมากขึ้นเล็กน้อย
GBGOLC

1
จากคิวการตรวจสอบ:ฉันขอให้คุณโปรดเพิ่มบริบทเพิ่มเติมเกี่ยวกับคำตอบของคุณ คำตอบที่ใช้รหัสเท่านั้นเป็นเรื่องยากที่จะเข้าใจ จะช่วยให้ผู้ถามและผู้อ่านในอนาคตทั้งสองอย่างหากคุณสามารถเพิ่มข้อมูลเพิ่มเติมในโพสต์ของคุณ ดูยังอธิบายทั้งหมดตอบรหัสตาม
help-info.de


2

ในการตรวจสอบ OleDbConnection State ให้ใช้สิ่งนี้:

if (oconn.State == ConnectionState.Open)
{
    oconn.Close();
}

State ส่งคืนไฟล์ ConnectionState

public override ConnectionState State { get; }

นี่คือConnectionStateenum อื่น ๆ

public enum ConnectionState
    {
        //
        // Summary:
        //     The connection is closed.
        Closed = 0,
        //
        // Summary:
        //     The connection is open.
        Open = 1,
        //
        // Summary:
        //     The connection object is connecting to the data source. (This value is reserved
        //     for future versions of the product.)
        Connecting = 2,
        //
        // Summary:
        //     The connection object is executing a command. (This value is reserved for future
        //     versions of the product.)
        Executing = 4,
        //
        // Summary:
        //     The connection object is retrieving data. (This value is reserved for future
        //     versions of the product.)
        Fetching = 8,
        //
        // Summary:
        //     The connection to the data source is broken. This can occur only after the connection
        //     has been opened. A connection in this state may be closed and then re-opened.
        //     (This value is reserved for future versions of the product.)
        Broken = 16
    }

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