sql-server jdbc4驱动程序没有列出所有列?

时间:2013-09-16 08:56:47

标签: java sql-server jdbc

我有一个(sql server)列,其系统类型但没有数据类型(实际上它多于一个)。使用Microsoft jdbc4驱动程序并尝试使用此表的元数据列出所有列,此列中缺少数据类型的列未显示:

ResultSet rs = connection.getMetaData().getColumns(null,"schema","tableName", null);
while (rs.next()) {
    String column = rs.getString("COLUMN_NAME");
    System.out.println("column:" + column); // This will not print the column
}

如果您使用odbc驱动程序,例如C#,它会显示(具有缺少数据类型的列)。如果此列是约束,它将在使用jdbc api列出所有约束时显示:

ResultSet rs = connection.getMetaData().getIndexInfo(null, 
                                                     "schema", 
                                                     "tableName", 
                                                      true/*list unique*/, 
                                                      true);
while(rs.next()){
    String column = rs.getString("COLUMN_NAME");
    System.out.println("column:" + column); // This will print the column, if it is a unique constraint.
}

无论您使用jdbc4驱动程序还是jtds驱动程序,此行为都是相同的。

所以我的问题是,如果这是一个错误或者是我缺少的东西?是否可以以其他方式列出元数据以获取表的所有列?

创建不显示数据类型的表。这要求您创建一个对用户定义的数据类型没有读取权限的用户。这是如何重现它:

我找到了这段代码here

CREATE TYPE TEST_TYPE2 FROM [int] NOT NULL
GO
CREATE TABLE Customer
(
    CustomerID INT IDENTITY(1,1) NOT NULL,
    LastName    VARCHAR(100) NOT NULL,
    FirstName   VARCHAR(100) NOT NULL,
    ZIP         TEST_TYPE2 NOT NULL
)
GO
-- Create Table without UDDT
CREATE TABLE Customer_Orig
(
    CustomerID INT IDENTITY(1,1) NOT NULL,
    LastName    VARCHAR(100) NOT NULL,
    FirstName   VARCHAR(100) NOT NULL,
    ZIP         INT NOT NULL
)
GO

-- Create User with db_datareader to database
USE [master]
GO
CREATE LOGIN testUser WITH PASSWORD=N'THE_PASSWORD', 
 DEFAULT_DATABASE=[master], 
 CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE TEST_DATABASE
GO
CREATE USER testUser FOR LOGIN testUser 
GO
USE TEST_DATABASE
GO
EXEC sp_addrolemember N'db_datareader', N'THE_PASSWORD'
GO

我理解为什么它没有出现,但我的方式是否适用于odbc驱动程序?

0 个答案:

没有答案