如何将SQL中同区域的5个餐厅名称分别赋值给C#按钮文本
你的代码核心问题是循环逻辑错误:while (dr.Read())会逐行读取数据库返回的每一条记录,每次循环都把所有5个按钮的Text设置为当前行的餐厅名称(dr[1]),最终所有按钮都会被覆盖成最后一行的餐厅名。
你不需要修改dr[?]里的索引——因为每一行的餐厅名称都存在同一列(对应dr[1],更推荐用列名比如dr["Restaurantname"]避免索引混乱),而是要调整读取逻辑,让每一行数据对应一个按钮。
方案1:逐行读取赋值(直观易懂)
直接依次读取前5行数据,分别赋值给对应按钮:
private void Form5_Load(object sender, EventArgs e) { baglanti.Open(); // 建议只查询需要的列(Restaurantname),减少数据传输 SqlCommand komut = new SqlCommand("select Restaurantname from tbl_resturan where sehirid=25 and ilceid = @p1 ", baglanti); komut.Parameters.AddWithValue("@p1", Form2.svft2 + 1); SqlDataReader dr = komut.ExecuteReader(); // 读取第一行给button1 if(dr.Read()) button1.Text = dr["Restaurantname"].ToString(); // 读取第二行给button2 if(dr.Read()) button2.Text = dr["Restaurantname"].ToString(); // 读取第三行给button3 if(dr.Read()) button3.Text = dr["Restaurantname"].ToString(); // 读取第四行给button4 if(dr.Read()) button4.Text = dr["Restaurantname"].ToString(); // 读取第五行给button5 if(dr.Read()) button5.Text = dr["Restaurantname"].ToString(); baglanti.Close(); }
方案2:用数组简化代码(可扩展性强)
把按钮存入数组,循环读取数据并赋值,适合后续按钮数量变化的场景:
private void Form5_Load(object sender, EventArgs e) { baglanti.Open(); SqlCommand komut = new SqlCommand("select Restaurantname from tbl_resturan where sehirid=25 and ilceid = @p1 ", baglanti); komut.Parameters.AddWithValue("@p1", Form2.svft2 + 1); SqlDataReader dr = komut.ExecuteReader(); // 将按钮存入数组统一管理 Button[] restaurantButtons = { button1, button2, button3, button4, button5 }; int currentButtonIndex = 0; // 读取数据并赋值,直到读完所有数据或所有按钮都赋值完成 while (dr.Read() && currentButtonIndex < restaurantButtons.Length) { restaurantButtons[currentButtonIndex].Text = dr["Restaurantname"].ToString(); currentButtonIndex++; } // 如果数据库返回的餐厅不足5家,清空剩余按钮的文本 while(currentButtonIndex < restaurantButtons.Length) { restaurantButtons[currentButtonIndex].Text = string.Empty; currentButtonIndex++; } baglanti.Close(); }
关键优化提示
- 替换
dr[1]为列名dr["Restaurantname"]:这样即使数据库表结构调整列顺序,代码也不会出错,可读性更强。 - 移除多余的
komut.ExecuteNonQuery():ExecuteNonQuery()用于执行增删改操作,查询数据不需要调用它,直接用ExecuteReader()即可。 - 建议使用
using语句管理资源(可选):自动释放数据库连接、命令和读取器,避免资源泄漏:
using(SqlConnection baglanti = new SqlConnection("Data Source = ALI\\MSSQLSERVER01; Initial Catalog = YemekSepeti; Integrated Security = True")) { baglanti.Open(); using(SqlCommand komut = new SqlCommand("select Restaurantname from tbl_resturan where sehirid=25 and ilceid = @p1 ", baglanti)) { komut.Parameters.AddWithValue("@p1", Form2.svft2 + 1); using(SqlDataReader dr = komut.ExecuteReader()) { // 赋值逻辑... } } }
内容的提问来源于stack exchange,提问作者Ali Mohammad alizadeh
相关产品推荐
相关产品推荐

