已经有一个与此命令关联的开放DataReader必须首先关闭npgsql c#

问题描述 投票:-1回答:2

我做了我的reader.close(),它也不起作用。你能帮我解决我的问题吗?

IList<Borne> ListeBorne = new List<Borne>();
NpgsqlCommand maCommande2 = new NpgsqlCommand("Select * from borne;", conn);
NpgsqlDataReader monReader2 = maCommande2.ExecuteReader(CommandBehavior.CloseConnection);
NpgsqlCommand maCommandeEncaiss= new NpgsqlCommand("Select * from encaissement;", conn);
NpgsqlDataReader monReaderEncaiss = maCommandeEncaiss.ExecuteReader(CommandBehavior.CloseConnection);

while (monReaderEncaiss.Read())
{
    Encaissement encaiss = new Encaissement();
    encaiss.id = monReaderEncaiss.GetInt32(0);
    encaiss.mode_paiemant = monReaderEncaiss.GetString(2);
    encaiss.num_fact = monReaderEncaiss.GetString(9);
    ListEncaissement.Add(encaiss);
}

while (monReader2.Read())
{
    Borne b = new Borne();
    b.id = monReader2.GetInt32(0);
    b.nom = monReader2.GetString(2);
    ListeBorne.Add(b);
}

ViewBag.ref_borne = new SelectList(ListeBorne, "id", "nom");
ViewBag.num_fact = new SelectList(ListEncaissement, "id", "num_fact");
ViewBag.mode_paiement = new SelectList(ListEncaissement, "id", "mode_paiemant");

我在connectionString web配置中添加了preload reader = true,但它还没有工作。

c# asp.net .net npgsql
2个回答
1
投票

您必须关闭阅读器才能在同一连接上使用其他阅读器。

你应该尽可能使用using语句来实现IDisposable

using (var conn = new NpgsqlConnection("connection-string"))
{
    using (var command = new NpgsqlCommand("Select * from encaissement", conn))
    {
        conn.Open();
        using (NpgsqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                var encaiss = new Encaissement();
                encaiss.id = reader.GetInt32(0);
                encaiss.mode_paiemant = reader.GetString(2);
                encaiss.num_fact = reader.GetString(9);
                ListEncaissement.Add(encaiss);
            }
        }
    }
    using (var command = new NpgsqlCommand("Select * from borne", conn))
    {
        using (NpgsqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                var b = new Borne();
                b.id = reader.GetInt32(0);
                b.nom = reader.GetString(2);
                ListeBorne.Add(b);
            }
        }
    }
}

0
投票

“在使用SqlDataReader时,关联的SqlConnection正忙于为SqlDataReader提供服务,除了关闭它之外,不能对SqlConnection执行任何其他操作。” - msdn。

通常,您可能必须手动关闭连接。但是如果使用CommandBehavior.CloseConnection,则“当关联的DataReader对象关闭时,Connection对象将被关闭”。 - msdn。

IList<Borne> ListeBorne = new List<Borne>();

NpgsqlCommand maCommandeEncaiss= new NpgsqlCommand("Select * from encaissement;", conn);    
NpgsqlDataReader monReaderEncaiss = maCommandeEncaiss.ExecuteReader(CommandBehavior.CloseConnection);

while (monReaderEncaiss.Read())
{
    Encaissement encaiss = new Encaissement();
    encaiss.id = monReaderEncaiss.GetInt32(0);
    encaiss.mode_paiemant = monReaderEncaiss.GetString(2);
    encaiss.num_fact = monReaderEncaiss.GetString(9);
    ListEncaissement.Add(encaiss);
}
monReaderEncaiss.Close();

NpgsqlCommand maCommande2 = new NpgsqlCommand("Select * from borne;", conn);
NpgsqlDataReader monReader2 = maCommande2.ExecuteReader(CommandBehavior.CloseConnection);   

while (monReader2.Read())
{
    Borne b = new Borne();
    b.id = monReader2.GetInt32(0);
    b.nom = monReader2.GetString(2);
    ListeBorne.Add(b);
}
monReader2.Close();

etc...
© www.soinside.com 2019 - 2024. All rights reserved.