我正在尝试将记录插入到我的 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;
有人能发现问题吗?
一如既往,感谢任何帮助!
汤姆·马加罗
在授人以鱼的座右铭下,如何进行编程存在一些非常重要的问题。
我已经查看了声明和它的参数,直到我斗鸡眼,但找不到任何问题。
你不是这样做的。有一种可能有些常见但完全错误的想法,即“优秀”/经验丰富的程序员只是盯着东西看一会儿,然后跳出浴缸大喊“我发现了!!!”当他们赤裸着身子在街上奔跑时。
那是电影。不是现实生活。
实际上优秀的程序员都知道错误总是会发生并且是不可避免的。他们从来不会真正只是盯着事物而感到绝望。你开始调试、试验、尝试更简单的程序来仔细检查你的理解。
作为一个极其简单的最低限度的行为,例如,您首先.. 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,则不会发生这种情况。