【问题标题】:Validation of repetition of name in sql DB?验证sql DB中名称的重复?
【发布时间】:2020-06-17 04:26:43
【问题描述】:

我正在尝试检查用户名是否存在于我的数据库中 - 或不存在。我使用了以下逻辑,虽然出现了错误,但它也将用户的数据存储在数据库中。

一般情况是,如果出现错误,除非解决了错误,否则不会进行任何进程。

但它仍然存储名称和其他内容。是的,我正在尝试应用检查(我不太擅长)

String checkName="SELECT * FROM administrator WHERE name1='"+name+"'";
Pstat = con.prepareStatement(checkName);
rs = Pstat.executeQuery();

if(rs.next())
{
    nameTextField.setText(null);
    JOptionPane.showMessageDialog(null,"Please Enter Different Name","Error", JOptionPane.ERROR_MESSAGE);
}

这里PstatPreparedStatement的一个实例,conConnection的一个实例,rsResultSet的一个实例。

adminstrator 是表名,name1 是列名。

抱歉,我最近从 c++ 切换到 Java。对支票了解不多。

我收到一个错误

请输入其他名称

但是当我点击 Ok 时,我得到另一个弹出窗口

您的数据已输入

(这个弹出窗口是用户制作的,所以不用担心java如何在数据输入方面变得如此智能)

是的,我对next() 了解一些。但我在if 声明中看不懂....

谁能告诉我if 语句的后端发生了什么?

【问题讨论】:

  • if 语句只是检查用户是否存在,清除一些文本字段并弹出错误消息 - 然后代码流继续,就好像用户 不存在 存在.请提供minimal reproducible example
  • 那么regex 呢?我也使用了正则表达式,但结果与if 相同。它显示弹出错误并仍然输入数据
  • 提示 - 每当您提出问题时,请提供您所指的完整代码,正如@AlexRudenko 指出的那样。最好的方法是在 Github 或 BitBucket 上为您的代码创建一个公共 Git 存储库,并将存储库的链接添加到问题描述中。然后通过提供文件名和共享 sn-ps 来提及您具体引用的代码文件。将使每个人的生活更轻松一点。人们无法正确猜测您在 sn-p 上方和下方所做的事情。绝对不在 StackO 上。除了我。在某些情况下。只有当它足够明显时。

标签: java sql swing jframe


【解决方案1】:

if(rs.next()) 的后端发生了什么:

  1. 当您的代码执行到达if() 时,它会执行 rs.next()
  2. 根据查询结果,ResultSet 对象rs 要么有零个或多个结果。
  3. rs 对象维护一个指向它包含的所有记录的指针。 最初,此指针指向之前的一种“虚拟”位置 实际记录。
  4. 例如如果rs 对象中有三个记录,例如 [0,1,2], 然后最初指针指向 -1。
  5. 每次在rs上调用next(),指针都会移动一位 前进,如果新位置上存在记录, next() 返回true
  6. 如果新位置没有记录,next() 返回 false
  7. 为了您的问题,假设有记录 可用,rs.next() 返回true
  8. 因此,执行进入if() 正文。
  9. rs.next() 如果有多个记录,通常在循环内调用 是从选择查询中预期的,但是由于您的 代码,rs.next() 只执行一次。就是这样,没有 任何其他发生的事情。然后转到if() 正文。
  10. 在这里,编译器执行您编写的代码,即设置 nameTextField 的文本到 null 并显示您的弹出窗口 错误消息。
  11. 然后,编译器等待错误对话框关闭(我 想一想,不确定这一步,因为它太长了,但是去看看 javadocs 看看 JOptionPane.showMessageDialog() 是非阻塞还是阻塞)。
  12. 但是代码的执行并不止于此,事情似乎就在这里 让你的代码变得可疑。
  13. 在您随此问题提供的代码中,在您的 if() 正文结束之前,您没有任何 returnthrowbreak
  14. 所以编译器所做的只是简单地退出if() 主体并 继续执行下面的任何代码 - 我假设 用于插入数据,这就是您的“数据所在 插入”弹出窗口来自。

假设我对丢失代码的假设是正确的,在if(rs.next()) 内添加return 语句或在JOptionPane.showMessageDialog() 下方抛出Exception 应该可以解决您的问题。

Ciao!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多