【问题标题】:Syntax error in prepared statement that runs in SQL在 SQL 中运行的准备好的语句中的语法错误
【发布时间】:2019-10-19 06:55:18
【问题描述】:

即使我的查询在 SQL Management Studio 中运行,我在准备好的语句中也遇到了语法错误。我正在使用 GlassFish 4.1.1。我做错了什么?

我尝试稍微切换一下语法,但总是出错。

这是我的连接池代码:

try {
    InitialContext ic = new InitialContext();
    dataSource = (DataSource) ic.lookup("java:comp/env/" + database);
} catch (Exception ex) {
    ex.printStackTrace();
}

这是我的查询代码:

ConnectionPool pool = new ConnectionPool("BoxPointHAMBURGO");
Connection connection = pool.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;

try {
    String query = "SELECT Tabla FROM BoxPointHAMBURGO.dbo.NombresTablas";

    ps = connection.prepareStatement(query);
    rs = ps.executeQuery();
} catch (Exception ex) {
    System.err.println("Error: " + ex.getMessage());
}

我得到的错误是:

Syntax error: Encountered "." at line 1 column 39.

【问题讨论】:

  • 为什么有两个点?
  • 这就像在这种情况下放置 .dbo.NombresTablas 一样,它也会在我的 Java 代码中给我一个错误,但在 SQL Management Studio 中却没有
  • MAINDB 的值是什么?它是一个非空常量吗?能否请您添加整个 query 变量值?
  • @KarolDowbecki 是的,MAINDB 是 BoxPointHAMBURGO,我将编辑我的问题
  • @KarolDowbecki 是的

标签: java sql-server jdbc prepared-statement


【解决方案1】:

根据this answer,双点.. 运算符会生成用于查询的当前数据库用户的默认架构。但是,您不应期望 SQL Management Studio 查询语法在使用 JDBC 时会起作用。这是两个完全不同的驱动程序接口,具有不同的限制,JDBC 很可能限制性更强。

您可能应该在建立 JDBC 连接时选择 BoxPointHAMBURGO 数据库。您必须按照Building the Connection URL 修改 JDBC URL,语法为:

jdbc:sqlserver://localhost;databaseName=BoxPointHAMBURGO

然后从 SQL 查询中删除数据库名称:

SELECT Tabla FROM dbo.NombresTablas

请注意dbo 架构can only be accessed by the user that is the database owner 下的表。

【讨论】:

  • 我的 context.xml 中有那个 URL。我从查询中删除了数据库,但这只是给了我一个新的错误,上面写着Schema 'DBO' does not exist,即使我确定它确实存在。
  • 根据链接的答案,用于打开数据库连接的用户不是数据库所有者,因此它看不到 dbo. 对象。
  • re:“双点 .. 运算符导致默认 dbo schema 用于您的查询” - 不,它会导致有效架构被指定为默认架构对于当前数据库用户。很多时候是dbo,但并非总是如此。
猜你喜欢
  • 2014-06-18
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多