【问题标题】:Java - String as new sql table name [duplicate]Java - 字符串作为新的sql表名[重复]
【发布时间】:2016-12-06 01:19:54
【问题描述】:

所以我试图创建新的 SQLite 表,其名称由我的应用程序中创建的字符串设置。字符串是从 int userID 和当前日期(到字符串)创建的

LocalDate date = LocalDate.now();

public void save()    {
    String db;
    db = String.valueOf("uid" + userID + date.toString());
    try {
        PreparedStatement pst = conn.prepareStatement("CREATE TABLE ?(name TEXT, kcal FLOAT, protein FLOAT, carbs FLOAT, fat FLOAT)");
        pst.setString(1, db);
        pst.executeUpdate();
    } catch (SQLException e)  {
        e.printStackTrace();
    }
}

最后的字符串如下所示:uid02016-12-05

不幸的是,我得到了

org.sqlite.SQLiteException: [SQLITE_ERROR] SQL 错误或缺少数据库(“?”附近:语法错误)

以及指向我的 PreparedStatement 的错误,我敢打赌“?”有问题,但如何以其他方式进行呢?

【问题讨论】:

  • 无法使用PreparedStatement 占位符设置表名。

标签: java sqlite


【解决方案1】:

您可以通过简单的字符串连接来实现。

String query = "CREATE TABLE " + db + " (name TEXT, kcal FLOAT, protein FLOAT, carbs FLOAT, fat FLOAT)";
PreparedStatement pst = conn.prepareStatement(query);

我相信 PreparedStatement 中的问号是针对参数而不是表名提及的。

【讨论】:

  • 哦,伙计,请不要。 OP 在使用 PreparedStatements 方面有正确的想法。最好不要提倡 sql 查询的字符串连接。它只是向人们发出了一个不好的信息。
  • 需要反引号和转义以防止 SQL 注入
  • 如果您知道如何在 PreparedStatement 中动态更改表名,请告诉我们。 OP 询问如何以其他方式做到这一点 - 对我来说,这样的事情无论如何都是个坏主意,但我不是来判断的。
  • 所以 Iv 创建了字符串连接,将日期格式更改为 yyMMdd 并且现在可以使用。但我知道那不是正确的方法吗?任何人都可以指出我正确的方向吗?
猜你喜欢
  • 2018-01-07
  • 2016-12-21
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 2023-03-14
  • 2013-09-15
  • 2013-08-16
  • 2016-01-22
相关资源
最近更新 更多