2011-12-04 14 views
0

準備済みの文で長い番号に問題があります。ここでは、コードは次のようになります。ここではJdbcOdbcPreparedStatement.setLong throw java.sql.SQLException:オプションの機能が実装されていません

String removeCltQry = "DELETE * FROM Clients WHERE client_id = ?"; 
long client_id = 10; 
Connection con = null; 
PreparedStatement pstm = null; 

try { 
    con = DBMngerST.instance().getDBCon(); 
    pstm = con.prepareStatement(removeCltQry); 
    pstm.setLong(1, client_id); 
    pstm.executeUpdate(); 
    pstm.close(); 
} catch (SQLException e) { 
    e.printStackTrace(); 
} finally { 
    if (con != null) { 
     try { 
      con.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

は、スタックトレースです:

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]Optional feature not implemented 
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source) 
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source) 
at sun.jdbc.odbc.JdbcOdbc.SQLBindInParameterBigint(Unknown Source) 
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setLong(Unknown Source) 
at testingPack.test5.main(test5.java:25) 

これが原因とされており、どのように私はそれを解決できますか?

+0

25行目はどれですか? –

+0

そしてまさに、どのJDBCドライバを使用していますか?どのバージョン? –

+0

MSバージョンの 'setLong'は実装されていません。 'setInt(1、(int)client_id)'を試したことがありますか?あなたは本当に 'client_id'の値が20億を超えることができますか? –

答えて

5

ODBCドライバの機能とJDBC-ODBCブリッジの期待値との間に不一致があると、「オプション機能が実装されていません」ということがよくわかります。この場合、setLongコールとアクセス側で使用されている有効なデータ型の間に不一致があるように見えます。

私のアドバイスは、使用しているMS Access/ODBCタイプがlongと本当に互換性があることを確認することです。理論的に表現可能なすべての値がJava long値として表現可能であることを意味する。スキーマを変更しても機能しない場合は、Java/JDBC側から数字をintまたはStringとして扱うことをお勧めします。

(実際のデータベースではないMS Accessを使用しており、MS Access ODBCドライバには機能上の制限があることに注意してください。また、新しいバージョンのドライバとブリッジをチェックする価値がありますライブラリ)

-3

idをこのようなクエリに入れてみてください。

String removeCltQry = "DELETE * FROM Clients WHERE client_id = 10"; 

long client_id = 10; 

Connection con = null; 
PreparedStatement pstm = null; 

try { 
con = DBMngerST.instance().getDBCon(); 
pstm = con.prepareStatement(removeCltQry); 

//pstm.setLong(1, client_id); 
pstm.executeUpdate(); 
pstm.close(); 


} catch (SQLException e) { 
    e.printStackTrace(); 
} finally { 
    if (con != null) { 
    try { 
     con.close(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    } 
}// finally 
+1

これはデバッグの目的では問題ありませんが、有線パラメータでクエリを構築するのは悪いことです。 –

+1

ユーザーのコードに本当に 'client_id'がハードコードされていれば問題ありません。しかし、私はそれが足場に過ぎないと考えています。 –

+0

ロバートに感謝します。しかし、私はPrepared Statementでそれを必要としています...そして、このように私は問題があります。 – Glebus

0

Javaのバージョンを知りたい。この例外は、PrepareStatementクラスのsetLongが不在に実装されているために発生しているようです。

また、古い実装によって引き起こされるバグかもしれません。 setLongのメソッドでいくつかのコメントを見ることができます。ここではenter link description hereを参照してください。

+0

私はJDK 6.0.27を持っています – Glebus