如何在不使用数据读取器的情况下查找我的product_id?

3

我的变量名称和数据库表都是正确的,但我收到了以下错误信息:

MySql.Data.MySqlClient.MySqlException: '已经有一个与此连接关联的打开的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
为了避免 SQL 注入,您应该使用参数化查询。 - S.Dav
@S.Dav 这取决于输入是否由用户提供。一般来说,这是一个好建议,不仅出于安全原因,还出于性能原因(执行计划)。 - Cleptus
你在哪一行遇到了错误? - Juan Carlos Oropeza
@bradbury9 一定要使用参数化查询。你永远不知道你的数据库将何时被调用并使用提供的数据。 - maccettura
十进制价格 = Convert.ToDecimal(urun_fiyati_bul(urun_id)); // 在这一行中的价格 @JuanCarlosOropeza - Birol çağlar
你没有提供 urun_fiyati_bul 函数的代码。你应该将数据连接起来,进行单个查询以检索所需的所有数据,可以参考 René 的答案中如何连接的示例。 - Cleptus
1个回答

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注入攻击! 请使用参数化查询。

我考虑过这个问题,但是 adisyonlar.urun_id = urunler.urn_id,那还有什么意义呢? - Juan Carlos Oropeza
@JuanCarlosOropeza 的意思是 OP 想要从 urunler 中获取一条记录,其中 urun_id 列的值与 adisyonlar 表中的记录的 urun_id 列的值相同。(抱歉打错字了,漏了一个“u”)。 - René Vogt
@JuanCarlosOropeza 减少数据库访问 --> 更快的响应时间 - Cleptus
我明白了,我应该使用连接参数化查询。而不是选择(Select)。 - Birol çağlar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接