C# 从Access数据库读取Boolean类型值的实现方法
C#读取Access数据库布尔类型权限值方案
核心问题说明
你当前代码有两个直接导致读取失败的问题:
- 校验SQL仅查询了
ID字段,没有查询存储权限的布尔字段,根本没有拿到权限数据 - 没有对查询返回的行数据做字段取值和类型转换,无法给权限变量赋值
另外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
相关产品推荐
相关产品推荐

