【问题标题】:Cannot insert data to Database Java without any error [closed]无法在没有任何错误的情况下将数据插入数据库 Java [关闭]
【发布时间】:2019-12-11 21:40:22
【问题描述】:

我已尝试添加 stmt.executeUpdate();插入数据库,但它仍然无法正常工作!处理后,没有显示错误,但没有数据插入数据库。

            try {
                // do insert
                String preparedSQL = "insert into abc (NUM, ID) VALUES (?,?)";

                for(int i = 1; i < r.length; i++)
                {


                stmt = conn.prepareStatement(preparedSQL);
                // SQL parameters
                setString(stmt, i++, Num);
                setString(stmt, i++, r[i]);
                stmt.executeQuery();


                }
                stmt.executeUpdate();
                stmt.close();
            } catch (SQLException e) {

                PrintWriter out = new PrintWriter(new OutputStreamWriter(res
                        .getOutputStream(), "Big5"), true);
                res.setContentType("text/html; charset=utf-8");
                res.setHeader("cache-control", "no-cache");
                res.setHeader("Pragma", "no-cache");
                res.setIntHeader("expiry", -1000);
                out.println("..<!--" + RSCommonUtil.HTMLEncode(e.toString()) + "para in title not valid" + 
                RSCommonUtil.HTMLEncode(pDate.toString())
                        + " " + RSCommonUtil.HTMLEncode(startPubDateAndEndPubDate[0].toString()) + " "
                        + RSCommonUtil.HTMLEncode(startPubDateAndEndPubDate[1].toString()) + "-->");

                debug.p("insert error" + e);
                failed = true;
            } finally {
                try {
                    // finalize DB
                    if (stmt != null) {
                        stmt.close();
                        stmt = null;
                    }
                } catch (SQLException sqle) {
                }
            }

【问题讨论】:

  • “紧急帮助”从您的问题标题中删除:请记住,虽然问题对您来说很紧急,但对我们来说不应该变得紧急,因为您的问题/问题并不比任何人都重要其他的在这个网站上。为了提高您获得快速和体面答案的机会,而不是说“紧急”,请尽量按照How to Ask 链接提出最好的问题。
  • 您使用的是 executeQuery(),而不是 executeUpdate()。而且你只需要准备一次声明:这就是准备好的声明的全部意义。
  • 这,catch (SQLException sqle) { } 可能并不明智。至少打印堆栈跟踪,因为您可能缺少关键异常。
  • 如果出现错误,您不会在控制台上打印任何内容。仅在 HTML 注释中,out。我的猜测是您还没有阅读此方法生成的 HTML 注释。您真的不应该将 HTML 生成与数据库访问代码混为一谈。
  • 另一个可能的问题:如果您的数据库连接未设置为自动提交,那么您的插入未提交。此外,您将在 try 正文的末尾关闭您的 stmt 一次,然后在 finally 块中关闭第二次。

标签: java jdbc


【解决方案1】:

executeUpdate 用于创建、删除、插入、更新、删除等(即更新您的表),executeQuery 用于选择。它返回一个 ResultSet 的实例。

简单解释见这里:https://www.javatpoint.com/PreparedStatement-interface

另外,您的setString 的参数数量不正确,它应该作为语句对象的方法调用,并且parameterIndex(setString 方法的第一个参数)应该只是i,因为您否则每次迭代将增加三倍。我还将循环更改为从 0 开始,不知道为什么要从 1 开始,因为普通数组应该从 0 开始。

所以你的主要块是这样的:

...
            // do insert
            String preparedSQL = "insert into abc (NUM, ID) VALUES (?,?)";

            PreparedStatement stmt = conn.prepareStatement(preparedSQL);

            for(int i = 0; i < r.length; i++)
            {

            // SQL parameters
            stmt.setString(i, Num);
            stmt.setString(i, r[i]);
            stmt.executeUpdate();


            }
            stmt.close();
...

【讨论】:

    【解决方案2】:

    在try块中,尝试重写代码如下:

    String preparedSQL = "insert into abc (NUM, ID) VALUES (?,?)";
    for(int i = 1; i < r.length; i++)
    {
        stmt = conn.prepareStatement(preparedSQL);
        // SQL parameters
        stmt.setString(1, Num);
        stmt.setString(2, r[i]);
        stmt.executeUpdate();
        stmt.close();
    }
    

    setString 方法只接受两个参数。

    public void setString(int paramIndex, String value)

    这里的“paramIndex”是指准备好的语句中参数的索引,“value”是指要在该索引处插入的值。

    prepared statement 接口的 executeQuery() 方法用于 SELECT 查询。但在您的情况下,由于该语句是一个 INSERT 查询,您将不得不使用 executeUpdate() 方法。该方法用于CREATE、DROP、UPDATE、INSERT等语句。

    有关准备好的语句和示例代码的更多信息,请参阅this

    【讨论】:

      【解决方案3】:

      其他答案by yaldaby Nitish 都是正确的,有很好的建议。对于这个问题的一些cmets也是如此。我可以再添加一个想法,以及一个使用H2 Database Engine 写入和读取行的完整工作示例应用程序。

      Try-With-Resources

      使用try-with-resources 语法来缩短您的代码,并保证您的资源得到适当的关闭。

      示例应用

      package work.basil.example;
      
      
      import org.h2.jdbcx.JdbcDataSource;
      
      import java.sql.*;
      import java.time.OffsetDateTime;
      import java.time.ZoneOffset;
      import java.util.UUID;
      
      public class H2DateTimeExample
      {
          public static void main ( String[] args )
          {
              H2DateTimeExample app = new H2DateTimeExample ();
              app.demo ();
          }
      
          private void demo ( )
          {
              JdbcDataSource dataSource = new JdbcDataSource ();
              dataSource.setURL ( "jdbc:h2:mem:offsetdatetime_example_db;DB_CLOSE_DELAY=-1" ); // Set `DB_CLOSE_DELAY` to `-1` to keep in-memory database in existence after connection closes.
              dataSource.setUser ( "scott" );
              dataSource.setPassword ( "tiger" );
      
              // Create table.
              String sql = "CREATE TABLE person_ ( \n" +
                      " pkey_ UUID NOT NULL DEFAULT RANDOM_UUID() PRIMARY KEY , \n" +
                      " name_ VARCHAR NOT NULL , \n" +
                      "first_contacted_ TIMESTAMP WITH TIME ZONE NOT NULL " +
                      ") ;";
      //            System.out.println ( sql );
              try (
                      Connection conn = dataSource.getConnection () ;
                      Statement stmt = conn.createStatement () ;
              )
              {
                  stmt.execute ( sql );
              } catch ( SQLException e )
              {
                  e.printStackTrace ();
              }
      
              // Insert row.
              sql = "INSERT INTO person_ ( name_ , first_contacted_ ) \n";
              sql += "VALUES ( ? , ? ) \n";
              sql += ";";
              try (
                      Connection conn = dataSource.getConnection () ;
                      PreparedStatement pstmt = conn.prepareStatement ( sql , Statement.RETURN_GENERATED_KEYS ) ;
              )
              {
                  OffsetDateTime odt = OffsetDateTime.now ( ZoneOffset.UTC );
      
                  pstmt.setString ( 1 , "Jesse Johnson" );
                  pstmt.setObject ( 2 , odt );
                  pstmt.executeUpdate ();
      
                  ResultSet rs = pstmt.getGeneratedKeys ();
      //            System.out.println( "INFO - Reporting generated keys." );
      //            while ( rs.next() ) {
      //                UUID uuid = rs.getObject( 1 , UUID.class );
      //                System.out.println( "generated keys: " + uuid );
      //            }
      
              } catch ( SQLException e )
              {
                  e.printStackTrace ();
              }
      
      
              // Query table.
              sql = "TABLE person_ ;";
              try (
                      Connection conn = dataSource.getConnection () ;
                      PreparedStatement pstmt = conn.prepareStatement ( sql ) ;
              )
              {
                  try ( ResultSet rs = pstmt.executeQuery () ; )
                  {
                      while ( rs.next () )
                      {
                          UUID pkey = rs.getObject ( "pkey_" , UUID.class );
                          String name = rs.getString ( "name_" );
                          OffsetDateTime firstContacted = rs.getObject ( "first_contacted_" , OffsetDateTime.class );
                          System.out.println ( "pkey: " + pkey + " | name: " + name + " | firstContacted: " + firstContacted );
                      }
                  }
      
              } catch ( SQLException e )
              {
                  e.printStackTrace ();
              }
      
              System.out.println ( "Done." );
      
          }
      }
      

      密钥:0819123b-5c7f-4859-bd1b-f9dac82b855f |姓名:杰西·约翰逊 |第一联系人:2019-08-03T18:16:30.367840Z

      完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-13
        • 2022-07-21
        • 1970-01-01
        • 2015-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多