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

C#向DataTable传字符串筛选DataRow问题求助

问题诊断与快速修复

嘿,我一眼就揪出你代码里的问题啦!你看这段筛选表达式:

string exp = "login = 'log'";

这里的'log'是硬编码的固定字符串,不是你从输入框拿到的log变量的值啊!相当于你一直在找登录名是"log"的用户,而不是用户实际输入的账号,这就难怪数据库里有用户但查不到啦😅

修正后的代码

你需要把变量log的实际值拼进筛选表达式里,还要注意处理用户输入里的单引号(不然如果账号里有单引号,会直接导致表达式语法错误):

string log = txtLog.Text;
string pass = txtPass.Text;
// 先转义单引号,避免表达式报错
string escapedLog = log.Replace("'", "''");

if (!string.IsNullOrEmpty(log) && !string.IsNullOrEmpty(pass)) { // 原代码的else if逻辑有点突兀,调整为正常if判断更合理
    string exp = $"login = '{escapedLog}'";
    DataRow[] rows = tab.Select(exp);
    if (rows.Length < 1) { // 数组用Length比Count()更高效哦
        MessageBox.Show("No users!", "Error", MessageBoxButtons.OK);
    } else {
        DataRow row = rows[0];
        Console.WriteLine("log: {0}, pass: {1}", row[0].ToString(), row[1].ToString());
    }
}

额外优化建议

  1. 更安全的查询方式:直接拼接字符串容易出问题(比如特殊字符报错、逻辑漏洞),推荐用LINQ查询DataTable,不用拼表达式,可读性和安全性都更高:
// LINQ写法示例,无需拼接字符串
var matchingRows = tab.AsEnumerable()
                      .Where(row => row.Field<string>("login") == log)
                      .ToArray();
  1. 别忘了验证密码:你现在只验证了账号,后续记得把密码的判断加上哦!比如在筛选表达式里加AND pass = '{escapedPass}',或者在LINQ的Where条件里补充密码的对比逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:42:30