我把大概的东西直接放到JSP中就可以正确执行,但是放到Class中就是不行,下面是我大概的代码
public class getDBconn
{
  public getDBconn()
 {
    try
    {
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     }
     catch(ClassNotFoundException e)
     {
      System.out.print("classnotfound:"+e.getMessage());
      }
  }
   public Connection getConn(String dataname)
  {
    String url = dataname;
     try
     {   
        Connection conn=DriverManager.getConnection(url,"dba","sql");
      }
        catch(SQLException sqlexception) 
     {
       System.out.print("----error-----:"+sqlexception.getMessage());
      }
      finally
        {
            return conn;
        }
 } 然后调用getdbconn public class execData
 {
    private getDBconn getdbconn;    public execData(String dataname)
    {
       dataSqlAW = new getdbconn();
       conn = dataSqlAW.getConn(dataname);
    }   public  int createstmt()
   {
    int i = 0;
    try
     {
stmt = conn.createStatement();
i = 0;
     }
     catch(SQLException sqlexception)
     {
System.out.print(sqlexception.getMessage());
         i = -1;
      }
      finally
      {
return i;
      }
   }   public int executeData(String insert_sql)
  {

     int i = -1;
     try
     { 
        i = stmt.executeUpdate(insert_sql); //在这里把执行    
      }
     catch(SQLException sqlexception)
      {
      System.out.print(sqlexception.getMessage());
      i = -1;
      }
      finally
      {
      return i;
       }
       }   }
sql语句绝对正确,我用COPY下来的SQL语句直接在JSP文件中执行就没有任何问题

解决方案 »

  1.   

    呵呵,看了你的代码,既然返回了-1,一定到达了这里:
    <<
    catch(SQLException sqlexception)
    {
        System.out.print(sqlexception.getMessage());
        i = -1;
    }
    >>
    一定有异常产生的,打出来给大家看看。
    BTW,顺便把insert_sql也log出来给大家看看。
      

  2.   

    public Connection getConn(String dataname)
      {
         Connection conn=null;
        String url = dataname;
         try
         {   
            conn=DriverManager.getConnection(url,"dba","sql");
          }
            catch(SQLException sqlexception) 
         {
           System.out.print("----error-----:"+sqlexception.getMessage());
          }
          finally
            {
                return conn;
            }
     }
      

  3.   

    就是这里,根本就没有抛出异常
    执行完之后i = stmt.executeUpdate(insert_sql);
    就直接跳到了
    finally
    {
       return i;
    }
    我用
    try
    {     System.out.print("A");
        i = stmt.executeUpdate(insert_sql); //在这里把执行
        System.out.print("B");   
     }
      catch(SQLException sqlexception)
     {
      System.out.print("C");
      System.out.print(sqlexception.getMessage());
      i = -1;
     }
     finally
     {
       System.out.print("D");
       return i;
     }
    只打出了A和D
      

  4.   

    大概可能猜测了一下,这么再调试一下:

    <<
    catch(SQLException sqlexception)
    {
        System.out.print("C");
        System.out.print(sqlexception.getMessage());
        i = -1;
    }
    >>
    修改为
    <<
    catch(Exception ex) {
        ex.printStackTrace();
    }
    >>
    然后再告诉俺们打印的结果,看看俺的猜测对不对。
      

  5.   

    原因很多,比如你的insert_sql语句有问题又或者你的数据库里面根本就没有数据那应该是insert不应该是update
      

  6.   

    打印的结果是
    i = stmt.executeUpdate(insert_sql);抛出空指针异常,stmt没有被正确创建,为什么会这样啊?
      

  7.   

    呵呵,真是俺的猜测。
    你把createStatement和execute这两个逻辑上应该在一处的东西分开到了两个方法,肯定就存在这个隐患。另外,Statement怎么作为类成员来处理呢?实际上只是方法体中需要的东西啊。你把这两个方法合在一起再试试。:)
      

  8.   

    你的 executeData() 方法根本就没有保证 createstmt() 这个方法被调用。 :)
      

  9.   

    to : xiaohaiz(老土进城,两眼通红) 
    我把语句改成这样也还是那个结果啊
    stmt=conn.createStatement();
    i = stmt.executeUpdate(insert_sql);
    这又是怎么回事呢?多谢了
      

  10.   

    如果还是NullPointerException,那么看看conn是不是null
      

  11.   

    to xiaohaiz(老土进城,两眼通红) 我是这样的
    public class execData
     {
        private getDBconn getdbconn
        private Statement stmt
        public int createstmt (){
     .....   }
       public int executedata()
    {
     .....
    }
    然后在JSP中先调用createstmt方法,在调用executedata方法
      

  12.   

    为什么要把创建Statement的逻辑单独抽离出来外部调用呢?
      

  13.   

    to  xiaohaiz(老土进城,两眼通红) :如你所说,conn也是null,可是我明明连上了啊
      

  14.   

    finally{
       return conn;
           }
    这条语句是不管前面的运行情况怎么样.
    无论如何都会强行将conn返回.甚至在conn ==null的情况也会返回.
    这样你在程序中调用该连接时肯定是会无法创建createStatement.
    错误无法避免.
      

  15.   

    我连的是SYBASE的sqlanywhere数据库,如果连接上的话,SQLANYWHERE数据库是有提示的。
      

  16.   

    确实是conn为空,可是怎么会这样呢?
    我用这样的语句
    String url = "jdbc:odbc:inv001";
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    Connection conn = DriverManager.getConnection(url,"dba","sql");
    在jsp中直接连接,并executeUpdate都没有问题
    我在class中的代码是把class.forName放在了getDBconn的构造函数中,然后在在getconn方法中
    Connection conn=DriverManager.getConnection(url,"dba","sql");
    这样就conn就为空,请问难道这样不行吗?
      

  17.   

    看看是不是捕获不到的异常,如:NullPointerException
    在抛出异常的地方用Excption再截获一下看看是哪个地方的问题。应该是什么实例为空的错误。
      

  18.   

    你的连接类实在看着难受,在不改变你的方法的情况下给你简单重构了一下,如下:
    使用时按照静态方法来使用,Connection conn = getDBConn.getConn(...);
    BTW, 类名也改改吧。
    <<
    public class getDBconn {
        private static final String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
        static {
            try {Class.forName(DRIVER);}
            catch(ClassNotFoundException ex) {
                throw new RuntimeException("Driver error");
            }
        }    private getDBconn() {}
        
        /**
         * Apply JDBC Connection by given dataname
         * @param dataname JDBC URL String
         * @return JDBC Connection, return null if any error occurs.
         */
        public static Connection getConn(String dataname) {
            final String url = dataname;
            try {
                return DriverManager.getConnection(url,"dba","sql");
            } catch(SQLException ex) {
                // exception handle here.
                return null;
            }
        }
    }>>
      

  19.   

    验证一下 getDBConn.getConn(...) 是否返回null再继续。
      

  20.   

    你在try块里声明connreturn返回的当然是null了