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

C#数据库布尔值更新问题:单选框标志失效求助

解决C#中通过单选框更新数据库布尔值的问题

首先看你代码里的核心问题:string.Format的参数顺序完全混乱,而且直接拼接SQL字符串不仅有注入风险,还容易引发类型匹配错误,这就是功能失效的主要原因。咱们一步步来修正:


1. 拆解你的错误点

你写的SQL模板里有5个占位符:{0}对应Finish、{1}对应Place、{2}对应FinishTime、{3}对应Winnings、{4}对应ResultsId。但你在string.Format后传的第一个参数是(rdoDidFinish.Checked ? 1 : 0),虽然后续的参数顺序完全错位,加上Where条件的拼接逻辑写错,导致整个SQL语法错误,自然无法执行。

另外,你没有用using语句管理数据库连接和命令,容易造成连接泄漏;直接拼接用户输入(比如txtPlace.Text)还会带来SQL注入风险。


2. 修正后的代码实现

用参数化查询解决这些问题,同时保证资源自动释放:

// 使用using语句自动释放连接、命令资源,避免泄漏
using (SqlConnection cnn = new SqlConnection(Properties.Settings.Default.cnnString))
{
    cnn.Open();
    // 编写参数化SQL,@前缀是安全的参数占位符
    string sqlStatement = @"UPDATE Results 
                           SET Finish = @Finish, 
                               Place = @Place, 
                               FinishTime = @FinishTime, 
                               Winnings = @Winnings 
                           WHERE ResultsId = @ResultsId";
    
    using (SqlCommand cmd = new SqlCommand(sqlStatement, cnn))
    {
        // 逐个添加参数,匹配数据库字段类型
        // 如果Finish是SQL Server的bit类型,直接传bool值即可,无需转1/0
        cmd.Parameters.AddWithValue("@Finish", rdoDidFinish.Checked); 
        cmd.Parameters.AddWithValue("@Place", txtPlace.Text);
        
        // 处理日期类型:建议用TryParse做安全转换,避免格式错误抛出异常
        if (DateTime.TryParse(txtTime.Text, out DateTime finishTime))
        {
            cmd.Parameters.AddWithValue("@FinishTime", finishTime);
        }
        else
        {
            // 输入时间格式错误的处理逻辑,比如提示用户
            return;
        }
        
        cmd.Parameters.AddWithValue("@Winnings", txtWinnings.Text);
        cmd.Parameters.AddWithValue("@ResultsId", yourResultsIdValue); // 替换为你的ResultsId实际值(比如从控件/变量获取)
        
        // 执行更新并获取受影响行数,判断是否更新成功
        int rowsAffected = cmd.ExecuteNonQuery();
        if (rowsAffected > 0)
        {
            // 更新成功后的逻辑,比如提示用户
        }
        else
        {
            // 未找到对应记录的逻辑
        }
    }
}

3. 额外注意事项

  • 如果你的Finish字段是SQL Server的bit类型,直接传递rdoDidFinish.Checked这个布尔值即可,参数化查询会自动处理类型转换,不用手动转1/0。
  • 对于日期时间类字段,一定要做格式校验(比如DateTime.TryParse),避免因输入格式错误导致程序崩溃。
  • 永远不要用string.Format直接拼接包含用户输入的SQL语句,参数化查询是最安全、最稳妥的方式,还能避免类型匹配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:56:11