【发布时间】: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