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

Xamarin.Android 如何通过循环将MySQL查询的日期添加到Spinner

代码问题排查

核心问题列表

  • 创建ArrayAdapter后未绑定到Spinner控件,下拉框自然无法展示数据
  • DateStrings方法存在严重逻辑错误:
    • 数据库操作顺序颠倒,MySqlDataAdapter.Fill()会自动打开连接,你在Fill之后再调用openConnection()完全多余且逻辑错误
    • 循环内直接返回结果,最多只能拿到第一条数据,且ExecuteScalar()返回的是单个字符串值,强制转换为string[]会直接抛出类型转换异常
    • 无需循环多次查询数据库,第一次查询已经把所有符合条件的数据加载到SCTable中,直接遍历行取字段即可
    • Blank数组未初始化,无数据返回时会抛出空引用异常
    • 数据库连接使用后未释放,容易导致连接池溢出

修复后代码

OnCreate 方法修改

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    SetContentView(Resource.Layout.Score);

    Spinner cmbSDate = FindViewById<Spinner>(Resource.Id.cmbSDate);

    Email = Intent.GetStringExtra("Email");

    string SC = "";
    // 这里加using自动释放连接资源
    using (DB SCDB = new DB())
    {
        MySqlCommand SCCommand = new MySqlCommand("SELECT `Squad Code` from Accounts where Email = @Email", SCDB.getConnection());
        SCCommand.Parameters.Add("@Email", MySqlDbType.VarChar).Value = Email;
        SCDB.openConnection();
        var SCResult = SCCommand.ExecuteScalar();
        if (SCResult != null)
        {
            SC = Convert.ToString(SCResult);
        }
    }
    // 生成日期数组
    var dateList = DateStrings(SC);
    // 绑定适配器到Spinner
    ArrayAdapter<string> adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleSpinnerItem, dateList);
    adapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);
    cmbSDate.Adapter = adapter;
}

DateStrings 方法重写

private List<string> DateStrings(string squadCode)
{
    List<string> dateList = new List<string>();
    // 直接一次查询拿到所有符合条件的日期
    using (DB SCDB = new DB())
    {
        MySqlCommand SCCommand = new MySqlCommand("SELECT `Date` from `ComboBox` WHERE `Squad Code` = @SC", SCDB.getConnection());
        SCCommand.Parameters.Add("@SC", MySqlDbType.VarChar).Value = squadCode;
        SCDB.openConnection();
        using (MySqlDataReader reader = SCCommand.ExecuteReader())
        {
            while (reader.Read())
            {
                if (!reader.IsDBNull(0))
                {
                    dateList.Add(reader.GetString(0));
                }
            }
        }
    }
    return dateList;
}

额外优化建议

  • 不要把数据库查询放在UI主线程执行,数据量大的时候会导致ANR,建议用Task.Run放到后台线程查询,查询完成后再回到主线程绑定适配器
  • 静态变量Email、SC尽量不要用,避免内存泄漏和跨页面数据混乱,改成方法参数传递更安全

内容的提问来源于stack exchange,提问作者Marissa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:36:03