【发布时间】:2016-08-09 21:57:23
【问题描述】:
我的 SQL Server JDBC 驱动程序有问题,我尝试了 Microsoft JDBC 驱动程序和 JTDS 驱动程序,但它们都有相同的问题:如果我在 ResultSet 中查找“table.field”,则会收到错误“无效的列名”,但如果我寻找“字段”,它只会起作用。 这对我来说是个问题,因为我有一个自动生成查询并使用表示法“table.field”的应用程序,现在我已经在 MySQL 和 Postgresql 上工作过,它运行良好,但现在我需要添加 SQL Server 支持和我发现了这个问题。 这是驱动程序配置错误的问题,还是它们只能以这种方式工作? 还有其他可用的驱动程序吗?
我还发现了一个做不出来的案例,比如我创建了两个同名字段的表,在它们之间做了笛卡尔积。
表 t1,t2 是相同的,它们具有这种结构
------
| id |
------
| 1 |
------
| 2 |
------
如果我执行查询
SELECT * FROM t1,t2
在 SQL Server 上,结果将是
-----------
| id | id |
-----------
| 1 | 1 |
-----------
| 1 | 2 |
-----------
| 2 | 1 |
-----------
| 2 | 2 |
-----------
但是从 Java 中使用 JDBC 驱动程序我无法获得相同的结果,因为我无法访问 t1.id、t2.id 而只能访问 id 并且它只返回第一列。
这是示例代码
Connection conn = DriverManager.getConnection("jdbc:jtds:sqlserver://localhost:1433/test", "user", "pass");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM t1, t2");
while(rs.next()){
System.out.println(rs.getString("id")); //This works
System.out.println(rs.getString("t1.id"));//This not works
}
【问题讨论】:
-
这个查询的结果应该是什么?你得到一个笛卡尔积。制造这种感觉?
-
您应该在查询级别处理此问题并为 t1 和 t2 分配别名。
-
延斯查询的结果必须是笛卡尔积,这只是一个例子来说明我遇到的问题。 @Amal 对,这正是我的情况,所以我必须为每一列添加一个别名......我更喜欢自动系统,我的意思是其他系统(例如 MySQL、Postgresql)的 JDBC 驱动程序会自动执行此操作,但没关系。 .. 谢谢! :)
-
JDBC 只要求按列标签检索,表名(或表别名)不是列标签的一部分。
标签: java sql sql-server jdbc jdbc-odbc