各位老大,在mysql中下面的代码(?在= 左边的情况)可以运行,而在sybase中报错,有没有哪位兄弟遇到过啊。Java code    Class.forName(driver); Connection connection = DriverManager.getConnection(url,username,password); PreparedStatement statement = connection.prepareStatement("select * from managedaccount where ?=1"); statement.setString(1, "1"); statement.executeQuery();错误如下:Java code    Exception in thread "main" com.sybase.jdbc3.jdbc.SybSQLException: SQL Anywhere Error -143: Column '@p0' not found at com.sybase.jdbc3.tds.Tds.processEed(Tds.java:3069) at com.sybase.jdbc3.tds.Tds.nextResult(Tds.java:2373) at com.sybase.jdbc3.jdbc.ResultGetter.nextResult(ResultGetter.java:69) at com.sybase.jdbc3.jdbc.SybStatement.nextResult(SybStatement.java:220) at com.sybase.jdbc3.jdbc.SybStatement.nextResult(SybStatement.java:203) at com.sybase.jdbc3.jdbc.SybStatement.queryLoop(SybStatement.java:1705) at com.sybase.jdbc3.jdbc.SybStatement.executeQuery(SybStatement.java:1690) at com.sybase.jdbc3.jdbc.SybPreparedStatement.executeQuery(SybPreparedStatement.java:97) at Test.main(Test.java:29)

解决方案 »

  1.   

    楼主你弄反了吧select * from managedaccount where colName = ?
      

  2.   


    没反,我们的框架里就是这样写的 ,现在移值到 sybase iq, 报错
      

  3.   

    select * from managedaccount where ?=1 数据库的支持不一样。
      

  4.   

    你这里是动态的把数据列作为参数传递给query,这样的想法开始就存在问题。
    而且这个
    ("select * from managedaccount where ?=1"); statement.setString(1, "1");
    也不对啊
    应该是
    ("select * from managedaccount where ?=1"); statement.setString(0, "1")嘛建议你的构建("select * from managedaccount where ?=1");这个sql的时候,把参数列作为字符串用方法做替换。也就是说不要把数据列作为俄参数传递。
      

  5.   


    怎么构建我不关心,这都是公司的框架里这么干的,我只关心移植到sybase iq,在mysql里
     ("select * from managedaccount where ?=1"); 
    statement.setString(1, "id"); 是对的你可能是hibernate用习惯了,hibernate里是0开始,PreparedStatement 1开始的