为啥我的数据无法插入数据库? [关闭]

Posted

技术标签:

【中文标题】为啥我的数据无法插入数据库? [关闭]【英文标题】:Why my data cannot be insert into database? [closed]为什么我的数据无法插入数据库? [关闭] 【发布时间】:2021-01-23 06:04:14 【问题描述】:

我无法将输入保存到我的数据库中。有谁能够帮助我? 存在 SSL 问题,但可以通过将 SSL 设置为 false 来解决,但数据似乎只能读取但不能保存到我的数据库中。

package first;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Connection;
import javax.swing.JOptionPane;

public class CustomersForm extends javax.swing.JFrame 
    public CustomersForm() 
        initComponents();
    

    private void jButton_addcusActionPerformed(java.awt.event.ActionEvent evt) 
        // TODO add your handling code here:
        try 
            Class.forName("com.mysql.jdbc.Driver");
            String connectionURL = "jdbc:mysql://localhost:3308/java_his_db";
            Connection con = DriverManager.getConnection(connectionURL, "root", "");
            String sql = "Insert into customers ('fname') values (?)";
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(2, jTextField_fname.getText());
            ps.executeUpdate();
            System.out.println("YES");
            con.close();
        
        catch(Exception e)
            JOptionPane.showMessageDialog(rootPane, "Blank or Wrong User Profile", "Insert Error", 2);
          
                                                             

    private void jTextField_fnameActionPerformed(java.awt.event.ActionEvent evt)                                                  
        // TODO add your handling code here:
    

【问题讨论】:

将以下行添加到方法 jButton_addcusActionPerformed 中的 catch 块中:e.printStackTrace()。然后运行你的程序。然后edit您的问题并发布整个堆栈跟踪和错误消息。 您说的是“SSL 问题”。你的意思是“SQL 问题”吗? 【参考方案1】:

Answer by Andrew Vershinin 看起来正确。你的占位符号码2 应该是1

您评论说您仍然有错误,但忽略了描述这些错误。错误可能来自 INSERT 语句的 SQL。您不应该制作列名的字符串。你把单引号放在它们不属于的地方。作为commented by Abra,'fname' 周围的单引号使该文本成为string literal,而不是列名。在需要列名的 SQL 中,字符串文字没有意义。

您的代码:

String sql = "Insert into customers ('fname') values (?)";

……应该是:

String sql = "INSERT INTO customers ( fname ) values (?) ;";

在我下面的例子中,你会看到类似的代码:

INSERT INTO person_ ( name_ )
VALUES ( ? )
;

这是一个完整的示例应用程序,它使用一个表 person_ 创建一个数据库,在该表中插入两行,然后检索这两行。您可以看到调用 PreparedStatement#set… 方法的工作原理。

此代码使用H2 Database Engine。但是对于任何 SQL 数据库,以下代码几乎相同。

提示:将数据库访问代码与 GUI 代码分开。在尝试与 GUI 集成之前,让该数据库代码顺利运行。

提示:使用try-with-resources 自动关闭您的连接、语句、结果集等。

提示:始终包含可选的分号语句终止符。在某些地方你可以不使用它,但在其他地方可能会弄乱代码。保持整洁,保持一致。

package work.basil.example;

import com.thedeanda.lorem.LoremIpsum;
import org.h2.jdbcx.JdbcDataSource;

import javax.sql.DataSource;
import java.sql.*;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.util.Objects;

public class DbH2Example

    public static void main ( String[] args )
    
        DbH2Example app = new DbH2Example();
        app.demo();
    

    private void demo ( )
    
        // -------------------|  DataSource  |---------------------------------
        DataSource dataSource = null;
        
            org.h2.jdbcx.JdbcDataSource ds = Objects.requireNonNull( new JdbcDataSource() );  // Implementation of `DataSource` bundled with H2.
            ds.setURL( "jdbc:h2:mem:MyExampleDb;DB_CLOSE_DELAY=-1" );  // To keep an in-memory database after disconnecting, add DB_CLOSE_DELAY=-1 argument.
            ds.setUser( "scott" );
            ds.setPassword( "tiger" );
            ds.setDescription( "An example database showing how to insert a row." );
            dataSource = ds;
        
        Objects.requireNonNull( dataSource );

        // -------------------|  Prepare database  |---------------------------------
        
            String sql =
                    """
                    DROP TABLE IF EXISTS person_ 
                    ;
                    CREATE TABLE IF NOT EXISTS person_
                    (
                        name_ text NOT NULL  ,
                        row_created_ TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP() ,
                        id_ IDENTITY NOT NULL ,
                        CONSTRAINT person_pkey_ PRIMARY KEY ( id_ )
                    )
                    ;
                    """;
            try (
                    Connection conn = dataSource.getConnection() ;
                    Statement stmt = conn.createStatement() ;
            )
            
                System.out.println( "INFO - Preparing database. Message # adaaf8ed-8922-4c15-addf-35f6ead1442b. " + Instant.now() );
                stmt.executeUpdate( sql );
            
            catch ( SQLException e )
            
                e.printStackTrace();
            
        

        // -------------------|  Insert row  |---------------------------------
        
            System.out.println( "INFO - Insert rows. Message # 7a7e1c0a-7e97-4ebc-8d24-6e9ea20f8b5f. " + Instant.now() );
            String sql =
                    """
                    INSERT INTO person_ ( name_ )
                    VALUES ( ? )
                    ;
                    """;
            try
                    (
                            Connection conn = dataSource.getConnection() ;
                            PreparedStatement ps = conn.prepareStatement( sql ) ;
                    )
            
                ps.setString( 1 , "Alice" );
                ps.executeUpdate();

                ps.setString( 1 , "Bob" );
                ps.executeUpdate();
            
            catch ( SQLException e )
            
                e.printStackTrace();
            
        

        // -------------------|  Dump rows  |---------------------------------
        
            System.out.println( "INFO - Dump rows. Message # f6b786be-ef1e-4b97-9779-59bc84566e3d. " + Instant.now() );
            try
                    (
                            Connection conn = dataSource.getConnection() ;
                            Statement stmt = conn.createStatement() ;
                    )
            
                String sql =
                        """
                        TABLE person_
                        ;
                        """;
                try (
                        ResultSet rs = stmt.executeQuery( sql ) ;
                )
                
                    while ( rs.next() )
                    
                        String name = rs.getString( "name_" );
                        Instant whenCreated = rs.getObject( "row_created_" , OffsetDateTime.class ).toInstant();
                        long id = rs.getLong( "id_" );
                        System.out.println( "whenCreated = " + whenCreated + " | " + "id : " + id + " | " + "name = " + name );
                    
                
            
            catch ( SQLException e )
            
                e.printStackTrace();
            
        
    

运行时。

INFO - Preparing database. Message # adaaf8ed-8922-4c15-addf-35f6ead1442b. 2021-01-23T06:44:22.363589Z
INFO - Insert rows. Message # 7a7e1c0a-7e97-4ebc-8d24-6e9ea20f8b5f. 2021-01-23T06:44:22.389564Z
INFO - Dump rows. Message # f6b786be-ef1e-4b97-9779-59bc84566e3d. 2021-01-23T06:44:22.414178Z
whenCreated = 2021-01-23T06:44:22.393600Z | id : 1 | name = Alice
whenCreated = 2021-01-23T06:44:22.413983Z | id : 2 | name = Bob

【讨论】:

现在我明白了!这是字符串错误,我太多余了,无法在输入周围添加这些引号【参考方案2】:

您的查询中只有一个占位符,因此在此语句中索引应该是一个:ps.setString(1, jTextField_fname.getText());

【讨论】:

但它仍然显示异常消息:( @Nash 什么例外? 提示:SQL 字符串错误(在原题中) @Andrew 它显示“空白或错误​​的用户配置文件” @Nash 'fname' 是 SQL 中的字符串文字,而不是数据库表 customers 中的列名。您是否阅读了我的comment 来回答您的问题?如果您想要解决问题的答案,则需要提供所有有关您声称遇到的异常的详细信息。

以上是关于为啥我的数据无法插入数据库? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

无法将值 NULL 插入列“EmpId”[关闭]

为啥TDengine由于Invalid table ID无法插入数据

无法插入数据java mysql [关闭]

mybatis实现插入操作,框架默认事务自动提交是关闭的,为啥我没commit,数据就进库了?

mybatis插入语句为啥不行啊

为啥我的改造代码没有在数据库中插入数据?