【问题标题】:How to insert a row into MS Access using JDBC PreparedStatement?如何使用 JDBC PreparedStatement 在 MS Access 中插入一行?
【发布时间】:2014-10-31 18:19:44
【问题描述】:

值未插入到 Access DB 中。我的 DSN 名称是“DB”,表名称是“Employee”。 Access DB 正在连接(由修改时间指示),但没有成功的插入操作。 NetBeans 给出错误:“未正确设置数据库位置。”我已经在数据源 (ODBC) 中使用我的数据库设置了 DSN。

try (Connection c = DriverManager.getConnection("jdbc:odbc:DB")) {
    PreparedStatement pss = c.prepareStatement("INSERT INTO Employee VALUES (?,?,?,?)");
    pss.setString(1, fn);
    pss.setString(2, ln);
    pss.setString(3, mn);
    pss.setString(4, add);
    pss.executeUpdate();
    c.commit();
}
} catch (ClassNotFoundException | SQLException e) {
    System.out.println(e);
}

这是完整的代码:

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author javaEntu
 */
public class DB extends HttpServlet {

    private static final long serialVersionUID = 1L;

    /**
     *
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    @
    Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws         ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            String fn = request.getParameter("fn");
            String ln = request.getParameter("ln");
            String mn = request.getParameter("mn");
            String ps = request.getParameter("ps");
            String add = request.getParameter("add");
            String gen = request.getParameter("gen");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet SV</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet SV at " + request.getContextPath() + request.getRequestURL()     + "</h1>");
            out.println("</body>");
            out.println("</html>");
            out.println("<B>Your details: </B>");
            out.println("<br>First name: " + fn);
            out.println("<br>Last name: " + ln);
            out.println("<br>Contact number: " + mn);
            out.println("<br>Password: " + ps);
            out.println("<br>Address: " + add);
            out.println("<br>Gender: " + gen);
            out.println("<br>Thank you!");

            try {
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

                try (Connection c = DriverManager.getConnection("jdbc:odbc:DB")) {

                    PreparedStatement pss = c.prepareStatement("INSERT INTO Employee VALUES     (?,?,?,?)");
                    pss.setString(1, fn);
                    pss.setString(2, ln);
                    pss.setString(3, mn);
                    pss.setString(4, add);
                    pss.executeUpdate();
                    c.commit();
                }
            } catch (ClassNotFoundException | SQLException e) {
                System.out.println(e);
            }
        }
    }
}

【问题讨论】:

  • 检查您的控制台输出。您可能会收到错误“查询值和目标字段的数量不同。”
  • @GordThompson:不,没有这样的错误。我重新检查了我的表格列。 FirstName 是我的 PrimaryKey。
  • 您的 Employee 表是否正好定义了四 (4) 个字段? (顺便说一句,FirstName 对于主键字段来说是一个非常糟糕的选择。当您在之前添加了 John Doe 之后需要将 John Smith 添加到数据库中时,您会怎么做?)
  • 是的,正好是 4 个字段。我只需要使用 Access 数据库检查代码,因此主键现在不是问题。我使用过 MySQL 并且效果很好。对 ODBC-Access 不太熟悉。
  • 在这里查看答案:stackoverflow.com/questions/1418807/…

标签: jdbc odbc ms-access-2013


【解决方案1】:

您的代码看起来不错。您可以添加日志语句以显示连接的外观(看起来像sun.jdbc.odbc.JdbcOdbcConnection@15be5b6)。 executeUpdate() 还返回插入了多少行。在我的northwind MS Access 数据库中,它可以工作并为类似的 INSERT 返回 1。在某处记录它。

我认为您的问题在于数据库连接。查找任何 ODBC 编辑器并检查您的 DSN 是否有效。您还可以将连接字符串更改为:jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\\Nwind.mdb

可能是 DSN 配置为 32 位,而您的 Java 是 64 位,反之亦然?

另见类似的 Netbeans 错误消息:the java db location is not set correctly

【讨论】:

  • 感谢您测试我的代码。我将检查日志语句和新的连接字符串。我正在使用 64 位 Java。在数据源中,未显示 32 位。一定是驱动有问题。
【解决方案2】:

你应该在c.commit()之后添加c.close()

 try (Connection c = DriverManager.getConnection("jdbc:odbc:DB")) {
     PreparedStatement pss = c.prepareStatement("INSERT INTO Employee VALUES     (?,?,?,?)");
     pss.setString(1, fn);
     pss.setString(2, ln);
     pss.setString(3, mn);
     pss.setString(4, add);
     pss.executeUpdate();
     c.commit();
     c.close();
 }

【讨论】:

  • 还是不行。我猜想 NetBeans 的数据库连接存在问题。
猜你喜欢
  • 2013-11-28
  • 1970-01-01
  • 2012-08-29
  • 2014-03-26
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
相关资源
最近更新 更多