Insert 语句的问题

问题描述 投票:0回答:1

我正在尝试将记录插入到我的 Oracle Thin 数据库中,但不断收到无效语法异常。我查看了该声明及其参数,直到我斗鸡眼,但找不到任何问题。

我能够连接到数据库。我正在使用 Java。

这是代码

    public boolean insert(Person person) {
    String sql = "INSERT INTO Person("
            + "FirstName, LastName, Salutation, DateOfBirth, Gender"
            + "Address1, Address2, Address3, City, State, PostalCode)"
            + " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
    try {
        Connection conn = ConnectionFactory.getConnection();
        PreparedStatement stmt = conn.prepareStatement(sql);
        stmt.setString(1, person.getFirstName());
        stmt.setString(2, person.getLastName());
        stmt.setString(3, person.getSalutation());
        stmt.setDate(4, person.getDateOfBirth());
        stmt.setString(5, person.getGender());
        stmt.setString(6, person.getAddress1());
        stmt.setString(7, person.getAddress2());
        stmt.setString(8, person.getAddress3());
        stmt.setString(9, person.getCity());
        stmt.setString(10, person.getState());
        stmt.setString(11, person.getPostalCode());
        stmt.executeUpdate();
        return true;

有人能发现问题吗?

一如既往,感谢任何帮助!

汤姆·马加罗

java sql insert
1个回答
0
投票

在授人以鱼的座右铭下,如何进行编程存在一些非常重要的问题。

我已经查看了声明和它的参数,直到我斗鸡眼,但找不到任何问题。

你不是这样做的。有一种可能有些常见但完全错误的想法,即“优秀”/经验丰富的程序员只是盯着东西看一会儿,然后跳出浴缸大喊“我发现了!!!”当他们赤裸着身子在街上奔跑时。

那是电影。不是现实生活。

实际上优秀的程序员都知道错误总是会发生并且是不可避免的。他们从来不会真正只是盯着事物而感到绝望。你开始调试、试验、尝试更简单的程序来仔细检查你的理解。

作为一个极其简单的最低限度的行为,例如,您首先.. print SQL 语句。也许将其复制/粘贴到 SQL 终端中,看看会发生什么。如果你这样做了,你就会看到:

INSERT INTO Person(FirstName, LastName, Salutation, DateOfBirth, GenderAddress1, Address2, Address3, City, State, PostalCode) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

并且大概很容易地发现了 Gender 和 Address1 之间缺少的逗号。

有人能发现问题吗?

进一步加倍思考如何不这样做。如果您要花时间盯着某些东西,请盯着您收到的错误,而不是代码。您似乎如此忽视错误,您甚至没有认为它重要到足以包含在您的问题中,只是“我收到语法错误”显然是您认为可以从该错误中得出的唯一结论,并且不值得再看一眼。但是代码啊,我们就盯着看吧。

也不要这样做。当您没有看到某个事物中的问题时,开始调试它(例如,运行调试器并逐步执行,或者添加一堆打印语句,或者编写更简单的内容来检查您的理解,或者在其他地方执行该工作( '重复')代码正在做什么,),如果这没有帮助,那就看看其他的东西。还要别的吗。例如错误消息。

关于这种风格的一些小设计说明:

  • 不要捕获异常,除非你知道如何处理它们。 “打印它”或“记录它”不是“处理它”。一个名为
    insert
    的方法已经在屋顶上大喊:“嗨!我做数据库的事情!” - 所以,它应该被声明为
    throws SQLException
    。仅当接口强制您不这样做时,仅在主体中为所有异常添加
    throws
    行是不合适的,或者异常与方法的名称、参数、上下文和 javadoc 所说的内容没有任何内在关系(即它会泄漏抽象的细节)。在这种情况下,您的 catch 块应该抛出一些东西,并将异常作为第二个参数包含在内。您不希望代码继续愉快地运行,就像什么都没发生一样(这就是“打印它”和“记录它”的作用),并且您不想拒绝调用者处理事情的机会。也许他们可以修复它,或者也许他们有更好的选择来报告它:假设此代码由 Web 框架使用,他们还可以记录相关的 Web 请求内容,例如 IP。如果此代码记录它并返回 false,则不会发生这种情况。
  • JDBC 极其笨重且难以直接使用。甚至,它并不是真正的目的(它是一个低级的、涵盖所有主要数据库的所有需求的粘合层)。使用旨在编写查询的抽象,例如 JDBI 或 JOOQ。
  • 自动提交模式很少是你想要的。
© www.soinside.com 2019 - 2024. All rights reserved.