public Integer addStudent(Student stu) throws SQLException {
// TODO Auto-generated method stub
String sql = "insert into student(stuNo,stuName,stuAge,stuGender,"
+ "stuBirth,stuAddress) values(?,?,?,?,?,?)";
Object[] params = { stu.getStuNo(), stu.getStuName(), stu.getStuAge(),
stu.getStuGender(), stu.getStuBirth(), stu.getStuAddress() };
if (insertObj(sql, params) != null) {
return new Integer(1);
}
return null;
}public static Integer insertObj(String sql, Object[] params){
Connection conn = JDBCUtils.getConnection();
try {
PreparedStatement ps = conn.prepareStatement(sql);
ParameterMetaData pm = ps.getParameterMetaData();
for(int i=1;i<=pm.getParameterCount();i++){
System.out.println(params[i-1]);
ps.setObject(i, params[i-1]);

}
Integer rtn = ps.executeUpdate();
JDBCUtils.free(null, ps, conn);
return rtn;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
我用addStudent调用insertObj时出现如下异常:
com.microsoft.sqlserver.jdbc.SQLServerException: com.microsoft.sqlserver.jdbc.SQLServerException: 关键字 'WHERE' 附近有语法错误。
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171)
at com.microsoft.sqlserver.jdbc.SQLServerParameterMetaData.<init>(SQLServerParameterMetaData.java:426)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.getParameterMetaData(SQLServerPreparedStatement.java:1510)
at hy.j2ee.jdbc.BaseDAO.insertObj(BaseDAO.java:96)
at hy.j2ee.jdbc.StudentOperationSqlServerImpl.addStudent(StudentOperationSqlServerImpl.java:20)
at hy.j2ee.jdbc.StudentDAOTest_SqlServer.main(StudentDAOTest_SqlServer.java:35)

解决方案 »

  1.   

    sql语句写错了,where 附近有错误
      

  2.   

    ps.setObject(i, params[i-1]);
    insertObj()方法里 stu.getStuNo(), stu.getStuName(), stu.getStuAge(),
    stu.getStuGender(), stu.getStuBirth(), stu.getStuAddress()中的stu找不到 肯定会报错 建议public static Integer insertObj(String sql, Object[] params Student stu){
      

  3.   

    没看出来上面sql语句那写错了
      

  4.   

    LZ上面的addStudent是这个StudentOperationSqlServerImpl类中的吗
      

  5.   

    测试下这个 insertObj 方法。可能是参数什么传的不对!
      

  6.   

    sql  语句有问题,建议用debug查看下
      

  7.   


    String sql = "insert into student(stuNo,stuName,stuAge,stuGender,"
    + "stuBirth,stuAddress) values(?,?,?,?,?,?)";
    Object[] params = { stu.getStuNo(), stu.getStuName(), stu.getStuAge(),
    stu.getStuGender(), stu.getStuBirth(), stu.getStuAddress() };没看出来 哪里能冒出来个 where 
    估计是你params 值有问题
      

  8.   

    一摸一样的代码我在操作MySql数据库时没有任何异常
      

  9.   


    你把最后SQL语句粘贴到 SqlServer查询分析器中 试试
      

  10.   

    不要用prepareStatement 改成一般的Statement试试直接把你执行的SQL放进去 如果成功了 就是你prepareStatement 初始化参数的问题
      

  11.   

    ParameterMetaData pm = ps.getParameterMetaData();
    提示是这行有问题
      

  12.   

    Note: The setter methods (setShort, setString, and so on) for setting IN parameter values must specify types that are compatible with the defined SQL type of the input parameter. For instance, if the IN parameter has SQL type INTEGER, then the method setInt should be used.If arbitrary parameter type conversions are required, the method setObject should be used with a target SQL type.In the following example of setting a parameter, con represents an active connection:   PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                         SET SALARY = ? WHERE ID = ?");
       pstmt.setBigDecimal(1, 153833.00)
       pstmt.setInt(2, 110592)
     估计是设置参数的问题 上面这种方法试试
      

  13.   

    建议将生成或者sql语句打印出来,并直接在命令行或者工具中使用正常后再放入代码中!
      

  14.   

    如果sql没有问题,那么就是你的这个 getParameterMetaData 方法有问题了,LZ再检查下吧
      

  15.   

    确实是getParameterMetaData 方法有问题,怎么解决啊?
      

  16.   


    public static Integer insertObj(String sql, Object[] params) {
    Connection conn = DbManager.getMysqlCon();
    try {
    PreparedStatement ps = conn.prepareStatement(sql);
    for (int i = 1; i <= params.length; i++) {
    System.out.println(params[i - 1]);
    ps.setObject(i, params[i - 1]);
    }
    ps.execute();
    } catch (Exception e) {
    e.printStackTrace();
    return null;
    }
    return 1; }
    你试下这个吧 希望能帮助你
      

  17.   

    奇怪,insert插入数据冒出来个where
      

  18.   

     可能是参数里面带有sql的关键字。 LZ仔细查看一下。
      

  19.   

    从三个地方 一:确认驱动包没有问题(写句简单的尝试是否正确,如:insert into test(id,name) values (?,?)通过预编译去完成操作)
               二:若第一步没问题。单步跟踪确认System.out.println(params[i-1])数据是否正常有问题
               三:若仍然解决不了 尝试使用19的办法不检索长度和类型,