如何在不使用datareader的情况下找到product_id?

时间:2018-04-03 14:38:02

标签: c# mysql

我的变量名,数据库表是对的,我得到这样的错误;

  

MySql.Data.MySqlClient.MySqlException:'已经有一个与此Connection关联的开放DataReader,必须先关闭。'

public string urun_adi_bul(string urun_id)// find product name 
{
     if (genel.baglanti.State == ConnectionState.Closed)
     {
         genel.baglanti.Open();
     }
     string urun_adi = "";
     genel.sqlgonder.Connection = genel.baglanti;
     genel.sqlgonder.CommandText = "Select * from urunler where urun_id="+urun_id;
     MySqlDataReader oku = genel.sqlgonder.ExecuteReader();
     while (oku.Read())
     {
         urun_adi = oku["urun_id"].ToString();
     }
     oku.Close();
     return urun_adi;// product name
}
public void hesapGetir(ListView lvSiparis, string masa_id)
{
        genel.baglanti.Open();
        MySqlCommand sqlgonder = new MySqlCommand();
        sqlgonder.Connection = genel.baglanti;
        sqlgonder.CommandText = "Select * from adisyonlar where masa_id = "+masa_id;
        MySqlDataReader oku = sqlgonder.ExecuteReader();
        lvSiparis.Items.Clear();
        string urun_adi = "",urun_id="";
        while (oku.Read())
        {
            urun_id = oku["urun_id"].ToString();
            decimal fiyat = Convert.ToDecimal(urun_fiyati_bul(urun_id)); // price
            decimal adet = Convert.ToDecimal(oku["urun_adet"]); // piece
            decimal toplam = fiyat * adet; // total
            urun_adi = urun_adi_bul(urun_id);

            ListViewItem item = new ListViewItem(urun_adi);
            item.SubItems.Add(adet.ToString());
            item.SubItems.Add(toplam.ToString());
            lvSiparis.Items.Add(item);
        }
        oku.Close();
        genel.baglanti.Close();
}

如何在循环中使用2个数据加载器?

1 个答案:

答案 0 :(得分:4)

每个连接只能有一个打开的阅读器(或任何类型的查询)。但是,如果将两个查询与JOIN

组合在一起,实际上只需要一个阅读器
SELECT adisyonlar.urun_id, urun_adet, urunler.urun_id
FROM adisyonlar
LEFT JOIN urunler
ON adisyonlar.urun_id = urunler.urun_id

这样你就让数据库完成工作以找到匹配的记录,你只需要一次查询而不是一次又一次地询问数据库adisyonlar中的每一行。

请注意,明确指定要获取的列而不是使用SELECT *获取所有列,这是更好的做法。

另外:您的查询对SQL injection开放了!请使用参数化查询。