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

C# 从Access数据库读取Boolean类型值的实现方法

C#读取Access数据库布尔类型权限值方案

核心问题说明

你当前代码有两个直接导致读取失败的问题:

  1. 校验SQL仅查询了ID字段,没有查询存储权限的布尔字段,根本没有拿到权限数据
  2. 没有对查询返回的行数据做字段取值和类型转换,无法给权限变量赋值

另外Access的Boolean类型底层存储规则为:-1 对应 True,0 对应 False,读取时需要注意类型兼容,同时你当前拼接SQL的写法存在SQL注入风险,建议改用参数化查询。

修复后的实现代码

修改Checking方法,完整可直接复用的代码如下:

private void Checking()
{
    // 每次查询前清空历史数据,避免多次输入导致数据累加
    ds.Clear();
    // 注意:请把SELECT后的权限字段名替换为你Login表中实际的布尔字段名
    string check = @"SELECT ID, sabtnam, modiriathamrahan, bbaresisavabegh, modiriatkomod, 
                    modiriatkarbaran, getbackup, getrestore 
                    FROM Login 
                    WHERE UserName=? AND UserPassword=?";
    
    using(OleDbDataAdapter da = new OleDbDataAdapter(check, con))
    {
        // 使用参数化查询避免SQL注入,OleDb参数按SQL中?的顺序匹配
        da.SelectCommand.Parameters.AddWithValue("@uName", txtUserName.Text);
        da.SelectCommand.Parameters.AddWithValue("@uPwd", txtPassword.Text);
        da.Fill(ds, "t1");
    }

    if (ds.Tables["t1"].Rows.Count != 0)
    {
        BlResult = true;
        this.BackgroundImage = imgTrue.Image;
        lblEnter.Visible = true;

        // 取匹配到的第一行用户数据
        DataRow userRow = ds.Tables["t1"].Rows[0];
        // 读取布尔值赋值,自动兼容Access返回的数字/布尔类型,空值默认按无权限处理
        Bsabtnam = userRow["sabtnam"] != DBNull.Value && Convert.ToBoolean(userRow["sabtnam"]);
        Bmodiriathamrahan = userRow["modiriathamrahan"] != DBNull.Value && Convert.ToBoolean(userRow["modiriathamrahan"]);
        Bbaresisavabegh = userRow["bbaresisavabegh"] != DBNull.Value && Convert.ToBoolean(userRow["bbaresisavabegh"]);
        Bmodiriatkomod = userRow["modiriatkomod"] != DBNull.Value && Convert.ToBoolean(userRow["modiriatkomod"]);
        Bmodiriatkarbaran = userRow["modiriatkarbaran"] != DBNull.Value && Convert.ToBoolean(userRow["modiriatkarbaran"]);
        Bgetbackup = userRow["getbackup"] != DBNull.Value && Convert.ToBoolean(userRow["getbackup"]);
        Bgetrestore = userRow["getrestore"] != DBNull.Value && Convert.ToBoolean(userRow["getrestore"]);
    }
    else
    {
        BlResult = false;
        // 登录失败时重置所有权限为false,避免历史数据残留
        Bsabtnam = Bmodiriathamrahan = Bbaresisavabegh = Bmodiriatkomod = 
        Bmodiriatkarbaran = Bgetbackup = Bgetrestore = false;
        this.BackgroundImage = imgFalse.Image;
        lblEnter.Visible = false;
    }
}

注意事项

  • SQL语句中SELECT后的字段名必须和你Access的Login表中实际存储权限的布尔字段名完全一致,如果你的字段名和示例中不同,直接替换即可
  • 不要用(int)userRow["字段名"] == -1这种硬编码判断,Convert.ToBoolean会自动识别Access存储的-1/0和原生布尔类型,兼容性更好
  • 代码中加了DBNull判断,避免字段为空时抛出类型转换异常,空值默认按无权限(false)处理
  • 每次查询前调用ds.Clear(),避免用户多次输入用户名密码时,DataSet中保留历史查询结果导致行数判断错误
  • 参数化查询除了防注入,还能避免用户名/密码中包含单引号等特殊字符时SQL语句执行报错

内容的提问来源于stack exchange,提问作者Lord.Aslan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:15:50