You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将SQL中同区域的5个餐厅名称分别赋值给C#按钮文本

解决C# WinForm按钮赋值重复问题:从数据库提取5家餐厅分别赋值给button1-button5

你的代码核心问题是循环逻辑错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 00:18:19