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
相关产品推荐
相关产品推荐

