MySqlDataReader ปิดการเชื่อมต่อ

นี่คือรหัสของฉันสำหรับการเลือกข้อมูลจากตารางใน MySql:

            MySqlDataReader msdr;

            MySqlConnection connect = new MySqlConnection(connectionStringMySql);
            MySqlCommand cmd = new MySqlCommand();

            string commandLine = "SELECT id,token FROM Table WHERE id = @id AND token = @token;";

            cmd.CommandText = commandLine;

            cmd.Parameters.AddWithValue("@id", id);
            cmd.Parameters.AddWithValue("@token", token);

            cmd.Connection = connect;
            cmd.Connection.Open();

            msdr = cmd.ExecuteReader();

            //do stuff.....

            msdr.Close();
            cmd.Connection.Close();

อย่างที่คุณเห็นฉันปิดสองสิ่งนี้:

        msdr.Close();
        cmd.Connection.Close();

และอยากถามว่าต้องปิดสองตัวนี้ไหม? หรือจะปิดเฉพาะ cmd.Connection.Close(); ก็ได้

เหตุผลที่ฉันถามเพราะบางครั้งฉันได้รับข้อผิดพลาดนี้เมื่อฉันพยายามเลือกข้อมูลในตาราง: Details: MySql.Data.MySqlClient.MySqlException: Too many connections

และฉันต้องการทราบว่าเป็นเพราะฉันไม่ปิดการเชื่อมต่อนี้หรือไม่


person YosiFZ    schedule 02.06.2013    source แหล่งที่มา


คำตอบ (2)


การเข้ารหัสที่ดีที่สุดสำหรับสิ่งนี้มีดังต่อไปนี้

using(MySqlConnection connect = new MySqlConnection(connectionStringMySql))
using(MySqlCommand cmd = new MySqlCommand())
{
    string commandLine = "SELECT id,token FROM Table WHERE id = @id AND token = @token;";
    cmd.CommandText = commandLine;

    cmd.Parameters.AddWithValue("@id", id);
    cmd.Parameters.AddWithValue("@token", token);

    cmd.Connection = connect;
    cmd.Connection.Open();

    using(msdr = cmd.ExecuteReader())
    {

         //do stuff.....
    } // <- here the DataReader is closed and disposed.

}  // <- here at the closing brace the connection is closed and disposed as well the command

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

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

อัปเดตสำหรับ C# 8.0
ในภาษาเวอร์ชันนี้มีการปรับปรุงเล็กๆ น้อยๆ แต่มีประโยชน์สำหรับคำสั่งการใช้งาน เรียกว่า โดยใช้การประกาศ

ด้วยการเปลี่ยนแปลงนี้ โค้ดด้านบนสามารถเขียนได้โดยถอดเครื่องหมายปีกการอบบล็อกการใช้งานออก

using MySqlConnection connect = new MySqlConnection(connectionStringMySql);
using MySqlCommand cmd = new MySqlCommand();
string commandLine = "SELECT id,token FROM Table WHERE id = @id AND token = @token;";

.....
cmd.Connection.Open();
using msdr = cmd.ExecuteReader();
//do stuff.....

เมื่อเมธอดออกจากการประกาศการใช้ทั้งหมดจะทำหน้าที่กำจัดตัวแปรที่ประกาศซ้ำกัน

person Steve    schedule 02.06.2013

หากคุณใช้โค้ดนี้ในวิธีการใดวิธีหนึ่ง ควรปิดเครื่องอ่านข้อมูลและการเชื่อมต่อข้อมูลจะดีกว่า

person Monir Tarabishi    schedule 02.06.2013