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

C#连接Oracle实现身份认证时table.Rows.Count始终返回false问题

问题根因及解决方案

核心错误

SQL语句中给参数占位符加了多余的单引号,导致Oracle把@uL、@uP识别为普通字符串常量,而非你传入的参数值,所以永远匹配不到对应数据,自然返回结果为空。

修正步骤

  • 修改SQL命令文本,去掉参数外的单引号
    错误写法:
command.CommandText = "SELECT * from users where login='@uL' AND pass = '@uP' ";

正确写法:

command.CommandText = "SELECT * from users where login=@uL AND pass = @uP ";
  • 删除冗余填充逻辑
    你同时使用table.Load(command.ExecuteReader())和adapter.Fill(table)两种方式填充DataTable,属于重复操作,保留adapter.Fill(table)即可。
  • 补充连接释放逻辑
    现有代码查询完成后没有关闭数据库连接,会造成连接泄漏,建议添加异常捕获逻辑,确保查询结束后无论是否报错都关闭连接。
  • 修正变量拼写错误
    你定义的密码变量名为paswwordUser多写了一个w,建议修正为passwordUser避免后续取值出错。

修正后参考代码

private void button1_Click(object sender, EventArgs e)
{
    String loginUser = loginField.Text;
    String passwordUser = passwordField.Text;
    DB db = new DB();
    DataTable table = new DataTable();
    OracleCommand command = new OracleCommand();
    command.CommandType = CommandType.Text;
    command.CommandText = "SELECT * from users where login=@uL AND pass = @uP ";
    command.Parameters.Add("@uL", OracleDbType.Varchar2).Value = loginUser;
    command.Parameters.Add("@uP", OracleDbType.Varchar2).Value = passwordUser;
    command.Connection = db.GetConnection();
    try
    {
        db.openConnection();
        OracleDataAdapter adapter = new OracleDataAdapter(command);
        adapter.Fill(table);
        if (table.Rows.Count>0)
            MessageBox.Show("Yes");
        else
            MessageBox.Show("No");
    }
    finally
    {
        db.closeConnection();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 00:36:09