Sybase查询与Java准备语句不起作用

时间:2011-07-27 15:31:40

标签: java sybase prepared-statement

我有一个使用Java / JSP的Web应用程序运行MySQL数据库,我现在已经转移到Sybase。

我已经改变了我认为的所有相关连接部分(Sybase连接器和相关代码)

我一直在使用PreparedStatements来查询。在MySQL中工作的东西现在不再返回任何内容(错误或结果)。

我一直在测试的第一个简单查询是一个登录表单,它应该匹配“appuser”表中名称和密码的用户值。

提供的代码中的Prepared Statement用于工作,但不再适用于Sybase。

相关代码如下。如果还有其他需要,请告诉我。

public void connectDB() throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException
{
    /* String userName="****";
    String password="******";
    String url="jdbc:sybase:sybdev1dw/ETL_MON";
    Class.forName("com.sybase.jdbc4.jdbc.SybDriver").newInstance();
    conn=DriverManager.getConnection(url, userName, password); */

    String driver = "com.sybase.jdbc2.jdbc.SybDriver";
    String host = "********";
    String dbName = "********";
    String url = "jdbc:sybase:Tds:" + host  + ":4110" +"?SERVICENAME=" + dbName;
    String username = "*******";
    String password = "*********";

    Class.forName(driver);
    conn = DriverManager.getConnection(url, username, password);
    System.out.println("Connection successful"+conn);

}

public Boolean loginAction(String name, String pass, String role,HttpServletRequest request) throws SQLException {
    Boolean valid=false;
    session=request.getSession();
    PreparedStatement stmt=conn.prepareStatement("SELECT pass FROM appuser WHERE name=?");
    stmt.setString(1, name);
    results=stmt.executeQuery();

    System.out.println("loginAction:"+results.getFetchSize());

    while(results.next())
    {
        if(results.getString("pass").equals(pass)) 
        {
            valid=true;
            session.setAttribute("name",name);
            session.setAttribute("role",role);
        }
        else
        {
            valid=false;
        }
    }
    System.out.println("loginAction:"+valid);

    return valid;
}

1 个答案:

答案 0 :(得分:1)

字符串比较失败可能是因为空格被填充到数据库列。

result.getString("pass").trim().equals(pass.trim()) 

另一个建议。如果您确信它总是会返回一行(或零),而不是while(results.next()),请执行if(results.next())