我在DB2中创建了名为“TestDB
”的本地数据库,然后创建了名为“TestTable
”的表。
我发现该表放在模式名称下面是“yasmin
”
我正在尝试使用DB2
连接到JDBC
数据库但我得到了此异常
R SQLException information
[1/4/14 11:32:59:289 EST] 0000004d SystemErr R Error msg: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=DB2ADMIN.TESTTABLE, DRIVER=3.61.86
[1/4/14 11:32:59:290 EST] 0000004d SystemErr R SQLSTATE: 42704
[1/4/14 11:32:59:290 EST] 0000004d SystemErr R Error code: -204
[1/4/14 11:32:59:290 EST] 0000004d SystemErr R com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=DB2ADMIN.TESTTABLE, DRIVER=3.61.86
我在互联网上尝试了很多解决方案,就像设置模式一样,但遗憾的是无效。
这是我使用的JDBC代码
String urlPrefix = "jdbc:db2:";
String url;
String user;
String password;
String empNo;
Connection con;
Statement stmt;
ResultSet rs;
url = urlPrefix + "//127.0.0.1:50000/TestDB";
user = "db2admin";
password = "db2admin";
try
{
// Load the driver
Class.forName("com.ibm.db2.jcc.DB2Driver");
System.out.println("**** Loaded the JDBC driver");
// Create the connection using the IBM Data Server Driver for JDBC and SQLJ
con = DriverManager.getConnection (url, user, password);
// Commit changes manually
con.setAutoCommit(false);
System.out.println("**** Created a JDBC connection to the data source");
stmt = con.createStatement(); con.createStatement();
System.out.println("**** Created JDBC Statement object");
// Execute a query and generate a ResultSet instance
rs = stmt.executeQuery("select *from TestTable");
System.out.println("**** Created JDBC ResultSet object");
}
catch (ClassNotFoundException e)
{
System.err.println("Could not load JDBC driver");
System.out.println("Exception: " + e);
e.printStackTrace();
}
catch(SQLException ex)
{
System.err.println("SQLException information");
while(ex!=null) {
System.err.println ("Error msg: " + ex.getMessage());
System.err.println ("SQLSTATE: " + ex.getSQLState());
System.err.println ("Error code: " + ex.getErrorCode());
ex.printStackTrace();
ex = ex.getNextException(); // For drivers that support chained exceptions
}
}
答案 0 :(得分:11)
正如@Mark Rotteveel所说,-204
错误来自一个丢失的对象,但是由于其他原因而失踪了。
找不到它,因为您没有为模式名称添加前缀。您在上面说过,它位于架构yasmin
中,但您正在与db2admin
建立连接,因此它正在尝试查找db2admin.TestTable
。
SELECT * FROM yasmin.TestTable
应该是您正在寻找的。
默认情况下,架构的搜索路径是当前连接用户的名称。你可以看到它的用途
SELECT CURRENT SCHEMA FROM SYSIBM.SYSDUMMY1
如果要更改它,可以使用SET SCHEMA命令更改搜索路径,但通常只需在查询中包含模式名称即可。
答案 1 :(得分:3)
错误SQLERROR -204, SQLSTATE 42704是一个缺失/未知的对象名,很可能是由于缺少空格引起的:
rs = stmt.executeQuery("select *from TestTable");
应该是:
rs = stmt.executeQuery("select * from TestTable");
答案 2 :(得分:2)
问题是我在db2中创建的表具有模式名"yasmin"
我在JDBC连接中使用了用户名和密码"db2admin/db2admin"
所以它搜索此模式中的表“db2admin”
所以我需要将架构设置为"yasmin"
所以我在创建后添加了以下代码行
连接
String schemaName="yasmin";
if (schemaName != null && schemaName.length() != 0) {
try {
statement = connection.createStatement();
statement.executeUpdate("set current sqlid = " + schemaName);
System.out.println("The schema is set successfully.");
} catch (SQLException exception) {
exception.printStackTrace();
}
并在db2
中为此表授予db2admin所有权限 1 - 右键单击表格选择privilages
2 - 单击“添加用户”按钮
3 - 然后写入用户名“db2admin”并单击“应用”按钮
4 - 然后选择您刚添加的用户并单击“gtant all”按钮
现在他可以看到桌子了。
非常感谢@Mark Rotteveel和@bhamby的帮助。
答案 3 :(得分:0)
如果使用Hibernate在Spring中连接,请在属性行中使用以下内容
<property name="url" value="jdbc:db2://<ip>:<port>/<database>:currentSchema=<currentSchema>;" />
答案 4 :(得分:0)
其他方式只是创建一个ALIAS,喜欢这个:
CREATE ALIAS USER1.YOURTABLE FOR TABLE USER2.YOURTABLE;