DB2に「TestDB
」というローカルデータベースを作成し、次に「TestTable
」というテーブルを作成しました。
テーブルのスキーマ名は「yasmin
」です。JDBC
を使用してDB2
データベースに接続しようとしていますが、この例外が発生しました
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
}
}
@Mark Rotteveelが言ったように、-204
エラーはオブジェクトの欠落によるものですが、彼が言った以外の理由で欠落しています。
スキーマ名をプレフィックスとして付けていないため、見つかりません。あなたはそれがスキーマyasmin
にあると言ったが、db2admin
で接続しているので、db2admin.TestTable
を探している。
SELECT * FROM yasmin.TestTable
あなたが探しているものでなければなりません。
デフォルトでは、スキーマの検索パスは現在接続しているユーザーの名前です。あなたはそれが使用しているものを見ることができます
SELECT CURRENT SCHEMA FROM SYSIBM.SYSDUMMY1
変更したい場合は、 SET SCHEMA コマンドを使用して検索パスを変更できますが、通常はスキーマ名をクエリに含める方が簡単です。
エラー SQLERROR -204、SQLSTATE 42704 はオブジェクト名の欠落/不明であり、ほとんどの場合、スペースの欠落が原因です。
rs = stmt.executeQuery("select *from TestTable");
どちらにする必要があります:
rs = stmt.executeQuery("select * from TestTable");
問題は、db2で作成したテーブルのスキーマ名が"yasmin"
ユーザー名とパスワードを使用しました"db2admin/db2admin"
JDBC接続で
このスキーマ「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();
}
db2adminにdb2のこのテーブルのすべての特権を付与します
表を右クリックして特権を選択します
2-[ユーザーの追加]ボタンをクリックします
3-それからユーザー名「db2admin」を書き、「適用」ボタンをクリックします
4-次に、追加したばかりのユーザーを選択して、[すべてを削除]ボタンをクリックします
今、彼はテーブルを見ることができます。
@Mark Rotteveelと@bhambyに感謝します。
Hibernateを使用してSpringで接続している場合、プロパティ行で次を使用します
<property name="url" value="jdbc:db2://<ip>:<port>/<database>:currentSchema=<currentSchema>;" />
他の方法は、エイリアスを作成するだけです。これが好きです:
CREATE ALIAS USER1.YOURTABLE FOR TABLE USER2.YOURTABLE;