繁体   English   中英

JDBC PreparedStatement中的列索引错误

[英]Wrong column index in JDBC PreparedStatement

如果我执行:

Connection conn = null;
PreparedStatement LoginStatement = null;
ResultSet LoginResult = null;
UpdateData();
String LoginQuery = "SELECT * FROM USERS WHERE USER_NAME = ? AND PASSWORD = ? ";
try{
    System.out.println(LoginQuery);
    conn = DatabaseConnection.getDBCon();
    LoginStatement = conn.prepareStatement(LoginQuery);
    LoginStatement.setString(1, "ett");
    LoginStatement.setString(2, "ett");
    LoginResult = LoginStatement.executeQuery(LoginQuery);

我收到异常:63000-ORA-03115:不支持的网络数据类型或表示形式

如果我提高? 至 '?'

Connection conn = null;
PreparedStatement LoginStatement = null;
ResultSet LoginResult = null;
UpdateData();
String LoginQuery = "SELECT * FROM USERS WHERE USER_NAME = '?' AND PASSWORD = '?' ";
try{
    System.out.println(LoginQuery);
    conn = DatabaseConnection.getDBCon();
    LoginStatement = conn.prepareStatement(LoginQuery);
    LoginStatement.setString(1, "ett");
    LoginStatement.setString(2, "ett");
    LoginResult = LoginStatement.executeQuery(LoginQuery);

我懂了

例外:99999-UngültigerSpaltenindex

这基本上意味着错误的列索引。

这是不正确的,我设置了索引1和2,并且有2个占位符,并且索引以1开头。

只是:

executeQuery(LoginQuery); // Statement

一定是

executeQuery(); // PreparedStatement

有点可怕的API设计和错误消息。


另外,因为PASSWORD是保留字,请尝试

"SELECT * FROM USERS WHERE USER_NAME = ? AND \"PASSWORD\" = ? "

将您的代码更改为

LoginResult = LoginStatement.executeQuery();

您可以在此处查看有关第一个异常的更多信息java.sql.SQLException:ORA-03115:不支持的网络数据类型或表示形式

使用executeQuery()代替executeQuery(LoginQuery) ;

无需更改? '?'

无法在PreparedStatement或CallableStatement上调用executeQuery(String query)方法。 使用executeQuery()

请注意以下调用之间的区别:
// PreparedStatement
PreparedStatement.executeQuery(); //通常用于存储过程

//声明
bool res = Statement.execute(String sql);

ResultSet rs = Statement.executeQuery(String sql);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM