Koneksi dekat MySqlDataReader

Ini adalah kode saya untuk memilih data dari tabel di 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();

Seperti yang Anda lihat, saya menutup keduanya:

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

Dan saya ingin bertanya apakah saya perlu menutup keduanya? atau tidak masalah jika hanya menutup cmd.Connection.Close();

Alasan saya menanyakannya karena terkadang saya mendapatkan kesalahan ini ketika mencoba memilih data di tabel: Details: MySql.Data.MySqlClient.MySqlException: Too many connections

Dan saya ingin tahu apakah itu karena saya tidak menutup koneksi ini.


person YosiFZ    schedule 02.06.2013    source sumber


Jawaban (2)


Pengkodean terbaik untuk ini adalah sebagai berikut

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

pernyataan penggunaan akan membuat koneksi Anda tetap tertutup dan dibuang begitu juga dengan objek perintah. Tidak perlu memanggil Close secara eksplisit pada MySqlConnection atau MySqlDataReader karena pernyataan penggunaan akan melakukan ini untuk Anda JUGA jika ada Pengecualian yang dipicu dalam kode Anda antara buka dan tutup koneksi

Dalam kode asli Anda, cukup menutup koneksi satu kali saja dengan perintah, pembaca data, atau koneksi itu sendiri, karena keduanya bekerja dengan instance objek yang sama, tetapi jika Anda memiliki pengecualian maka kode Anda gagal menutup koneksi dan dengan demikian Anda risiko masalah 'terlalu banyak koneksi terbuka'

PEMBARUAN untuk C# 8.0
Dalam versi bahasa ini terdapat peningkatan kecil namun berguna pada pernyataan penggunaan. Ini disebut menggunakan deklarasi

Dengan perubahan ini kode di atas dapat ditulis dengan menghilangkan tanda kurung kurawal di sekitar blok penggunaan

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.....

Ketika metode keluar, semua deklarasi penggunaan akan bertindak untuk membuang variabel yang dideklarasikan masing-masing

person Steve    schedule 02.06.2013

jika Anda menggunakan kode ini dalam suatu metode, lebih baik tutup pembaca data serta koneksi data

person Monir Tarabishi    schedule 02.06.2013