【问题标题】:Inserting email in SQLite database using JDBC使用 JDBC 在 SQLite 数据库中插入电子邮件
【发布时间】:2025-12-13 01:10:01
【问题描述】:

我正在尝试将电子邮件 ID 插入到我的 SQLite3 数据库中的表中。在我的情况下,它成功创建了表,但在其中插入记录时出错 - “靠近“@gmail”:语法错误”。我该如何解决这个问题?这是代码-

public void insertData(String emailId, double gtse, long receivedDate) throws ClassNotFoundException, SQLException{
    Class.forName("org.sqlite.JDBC");
    Connection connection = null;

    try
    {
      // create a database connection
      connection = DriverManager.getConnection("jdbc:sqlite:testdb.sqlite");
      Statement statement = connection.createStatement();
      statement.setQueryTimeout(30);  // set timeout to 30 sec.

      ResultSet result = statement.executeQuery("SELECT name FROM sqlite_master WHERE type='table' AND name='T1'");
      if(!result.next()){
          statement.executeUpdate("create table T1 (email TEXT, gtse REAL, receiveddate DATE)");

      statement.executeUpdate("insert into T1 values(" + emailId + ", "+ gtse +", "+ receivedDate +")");      
      }
      else{

      }

    }
    catch(SQLException e)
    {
      // if the error message is "out of memory", 
      // it probably means no database file is found
      System.err.println(e.getMessage());
    }
    finally
    {
      try
      {
        if(connection != null)
          connection.close();
      }
      catch(SQLException e)
      {
        // connection close failed.
        System.err.println(e);
      }
    }
}

【问题讨论】:

    标签: java sqlite sqlitejdbc


    【解决方案1】:

    您的核心错误是,对于插入查询,您没有将要插入的值括在引号中。您的查询在构建后看起来像这样:

    insert into T1 values(whatever@gmail.com, emailtexthere,  04-07-2013)
    

    什么时候应该是这样的:

    insert into T1 values('whatever@gmail.com', 'emailtexthere',  '04-07-2013')
    

    SQL 解析器在尝试解析当前查询时阻塞,因为语法不正确。解决这个问题的方法是不是简单地用引号将值括起来,而是使用prepared statements。这是因为您现在构建查询的方式容易受到SQL injection attacks 的攻击。下面是一个使用准备好的语句的例子:

    PreparedStatement pStmt = conn.prepareStatement(
        "INSERT INTO T1 VALUES(?, ?, ?)");
    pStmt.setString(1, emailId);
    pStmt.setString(2, gtse);
    pStmt.setDate(3, receivedDate);
    pStmt.execute();
    

    【讨论】:

    • 我当前的查询看起来像这样,因为我正在向数据库中插入变量。插入 T1 值(“emailId,gtse,receivedDate”)。 emailId、gtse 和 receivedDate 是传递给此方法的变量
    • 使用准备好的语句也会将值插入到您的数据库中,但它更安全且不易出现您遇到的那种错误。