【问题标题】:How can I find my product_id without using datareader?如何在不使用 datareader 的情况下找到我的 product_id?
【发布时间】:2018-04-03 23:01:21
【问题描述】:

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

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

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 个数据读取器?

【问题讨论】:

  • 为了避免SQL注入,你应该使用参数化查询
  • @S.Dav 这取决于输入是否是用户提供的。作为一般规则,这是一个很好的建议,不仅出于安全原因,而且出于性能原因(执行计划)。
  • 哪一行出现错误?
  • @bradbury9 总是使用参数化查询。您永远不知道何时使用提供的数据调用您的数据库
  • 十进制 fiyat = Convert.ToDecimal(urun_fiyati_bul(urun_id)); // 这一行的价格@JuanCarlosOropeza

标签: c# mysql


【解决方案1】:

每个连接只能有一个打开的阅读器(或任何类型的查询)。但如果您将这两个查询与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 开放!请使用参数化查询。

【讨论】:

  • 我想过那个,但是adisyonlar.urun_id = urunler.urn_id 那有什么意义呢?
  • @JuanCarlosOropeza 他指出,OP 希望从urunler 获取记录,其中urun_id 列与adisyonlar 表中记录的urun_id 列具有相同的值。 (对不起,错字,错过了u)。
  • @JuanCarlosOropeza 更少的数据库访问 --> 更好的响应时间
  • 我知道了。我应该使用 join.Parameterized 查询。并且加入不是选择
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 2014-07-31
  • 2010-11-26
  • 2011-08-21
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多