我是一个菜鸟,刚写了一个用JDBC访问SQLServer的小程序,出现如下错误:
CreatCnSuc!
java.lang.NullPointerException
at JDBCOBJ.JDBCOBJ.RsQuery(JDBCOBJ.java:50)
at JDBCOBJ.TestDB.main(TestDB.java:24)
QueryErr!
java.lang.NullPointerException
at JDBCOBJ.TestDB.main(TestDB.java:25)我的源代码:package JDBCOBJ;
import java.sql.*;
public class TestDB {
public static void main(String args[])
{
String sqlStr = "select * From M_Oper";
ResultSet mRs;
boolean rtn = false;
String ServerNa = "w";
String DBNa = "HospitalDB";
String UserNa = "sa";
String PWD = "";
JDBCOBJ jdbc = new JDBCOBJ();
if(jdbc.CreatCN(ServerNa,DBNa,UserNa,PWD)==false)
{
System.out.println("CreatCnErr!");
}
else
{
System.out.println("CreatCnSuc!");

try
{
mRs = jdbc.RsQuery(sqlStr);
while(mRs.next())
{
System.out.print(mRs.getString("OperID") + " ");
System.out.print(mRs.getString("OperNa") + " ");
System.out.println(mRs.getString("OperCNa"));
}
}
catch(Exception err)
{
err.printStackTrace(System.out);
}



}

}
}这是调用它的代码:package JDBCOBJ;
import java.sql.*;
public class TestDB {
public static void main(String args[])
{
String sqlStr = "select * From M_Oper";
ResultSet mRs;
boolean rtn = false;
String ServerNa = "w";
String DBNa = "HospitalDB";
String UserNa = "sa";
String PWD = "";
JDBCOBJ jdbc = new JDBCOBJ();
if(jdbc.CreatCN(ServerNa,DBNa,UserNa,PWD)==false)
{
System.out.println("CreatCnErr!");
}
else
{
System.out.println("CreatCnSuc!");

try
{
mRs = jdbc.RsQuery(sqlStr);
while(mRs.next())
{
System.out.print(mRs.getString("OperID") + " ");
System.out.print(mRs.getString("OperNa") + " ");
System.out.println(mRs.getString("OperCNa"));
}
}
catch(Exception err)
{
err.printStackTrace(System.out);
}



}

}
}
请教各位高手,请帮我看一下是什么地方出问题了??谢谢了先!
还有,能不能帮我把这个类优化一下?由于我是初学Java这个类有好多地方写的有问题,比如RsQuery里,如果出现异常怎么办?还是返回Rs么?那么我怎么判断RsQuery是成功了还是失败了呢??
谢谢!!!

解决方案 »

  1.   

    mRs = jdbc.RsQuery(sqlStr); 出错 jdbc应该为NULLJDBCOBJ jdbc = new JDBCOBJ();这个类怎么写的
      

  2.   

    哦,不好意思,贴错了!!
    以下是JDBCOBJ这个类package JDBCOBJ;
    import java.sql.*;
    public class JDBCOBJ {
    Connection Scn; // connection object
    Statement St; //Statement object
    ResultSet Rs; //ResultSet object
    JDBCOBJ()
    {

    }
    public boolean CreatCN(String ServerNa,String DBName ,String UserNa,String PWD)
    {//OpenCN
    String url="jdbc:microsoft:sqlserver://" + ServerNa + ":1433;DatabaseName=" + DBName; 
    String user="sa"; 
    String password="";
    try
    {  
    Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 
    Connection Scn = DriverManager.getConnection(url,user,password);
    Statement St = Scn.createStatement();
    return true;

    }
    catch(Exception err)
    {
    err.printStackTrace(System.out);
    return false;
    }
    }
    public boolean CloseCN()
    {//CloseCN
    try
    {  
    Rs.close();
    St.close();
    Scn.close();
    return true;

    }
    catch(Exception err)
    {
    err.printStackTrace(System.out);
    return false;
    }
    }
    public ResultSet RsQuery(String sqlStr)
    {
    try
    {
    Rs = St.executeQuery( sqlStr );
    System.out.println("QuerySuc!");
    return  Rs;

    }
    catch(Exception err)
    {
    err.printStackTrace(System.out);
    System.out.println("QueryErr!");

    //Rs = new ResultSet;

    return Rs;  //Can return Or Not??
    }
    }

    }
      

  3.   

    import java.sql.*;
    import java.lang.*;
    import java.util.*;public class ConMSSQL{ String sDriver="com.microsoft.jdbc.sqlserver.SQLServerDriver";
    String sConn="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=northwind";
    Connection conn=null;
    ResultSet rs=null;
    String user="sa";
    String password="";
    Statement stmt=null;
    //public String STR; public ConMSSQL(){
    Connection con=null;
    try{
    Class.forName(sDriver).newInstance();//
    con=DriverManager.getConnection(sConn,this.user,this.password);
    }catch(Exception e){
    System.err.println(e.getMessage());
    //e.printStackTrace();
    }
    } public void User(String user){
    this.user=user;
    } public void Password(String password){
    this.password=password;
    }////////////////////////////////////////////////////////////////////////////////////////////throws Exception
    public String getSTR(String v){
    String STR = "";
    rs=null;
    String sql = "select productid,productname,unitsinstock,unitprice from products";
    try{
    conn=DriverManager.getConnection(sConn,this.user,this.password);;
    stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);//
    rs=stmt.executeQuery(sql);

    try{
    //while(rs.next()){
    // int id = rs.getInt(1);
    // String name= rs.getString(2);
    // String unitsinstock = rs.getString(3);
    // float unitprice = rs.getFloat(4);
    //}
    //if(rs.next()){
    // STR="ok";
    //}
    //rs.close();
    long CurTime = System.currentTimeMillis(); for(int i=0;i<200;i++){
    rs=stmt.executeQuery(sql);
    }
    long AfterTime = System.currentTimeMillis();
    //System.out.println("耗时:"+(AfterTime-CurTime)+"毫秒");
    STR = String.valueOf(AfterTime-CurTime); }catch(Exception e){
    STR="wrong"+e;
    //System.out.print(e);
    } }catch(SQLException a){ 
    System.err.println(a.getMessage());
    STR="wrongfff"+a;
    }
    //System.out.print(STR);
    //STR="kao";
    //rs=null;
    return STR;
    }
    ////////////////////////////////////////////////////
    public static void main(String args[]) {
    ConMSSQL p = new ConMSSQL();
    if(args.length == 0) {
    System.out.println("Not Set!");
    }else{
    for (int i=0; i < args.length; i++) {
    String arg = args[i]; long CurTime = System.currentTimeMillis(); System.out.println(p.executeQuery(arg));

    //System.out.println(CurTime);
    //for(int x=0; x<200; x++){
    //p.getSTR(arg);
    //}
    long AfterTime = System.currentTimeMillis();
    System.out.println("耗时:"+(AfterTime-CurTime)+"毫秒");
    }
    }
    }
    /////////////////////////////////////////////////////
    public ResultSet executeQuery(String sql){
    rs=null;
    try{
    conn=DriverManager.getConnection(sConn,this.user,this.password);
    stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    rs=stmt.executeQuery(sql);
    }catch(SQLException a){ 
    System.err.println(a.getMessage());
    }
    return rs;
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////}
      

  4.   

    RsQuery方法的St为null
    把CreatCN方法中的Statement St = Scn.createStatement();
    改为St = Scn.createStatement();
      

  5.   

    请问:mx1029() 
    Main函数的参数:String arg[]是做什么的,我一直没弄明白,谢谢!!
      

  6.   

    谢谢piaopiao!!
    问题已经解决。不过我家了一个CloseCN的过程,怎么又出现空指针了呢??不好意思阿,我刚接触java,什么都不会。能不能给我讲得详细一点??
    package JDBCOBJ;
    import java.sql.*;
    public class TestDB {
    public static void main(String args[])
    {
    String sqlStr = "select * From M_Oper";
    ResultSet mRs;
    boolean rtn = false;
    String ServerNa = "w";
    String DBNa = "HospitalDB";
    String UserNa = "sa";
    String PWD = "";
    JDBCOBJ jdbc = new JDBCOBJ();
    if(jdbc.CreatCN(ServerNa,DBNa,UserNa,PWD)==false)
    {
    System.out.println("CreatCnErr!");
    }
    else
    {
    System.out.println("CreatCnSuc!");

    try
    {
    mRs = jdbc.RsQuery(sqlStr);
    while(mRs.next())
    {
    System.out.print(mRs.getString("OperID") + " ");
    System.out.print(mRs.getString("OperNa") + " ");
    System.out.println(mRs.getString("OperCNa"));
    }
    }
    catch(Exception err)
    {
    err.printStackTrace(System.out);
    }
    }
    try
    {
    rtn=jdbc.CloseCN();
    if (rtn)
    {
    System.out.println("CloseCnSuc!");
    }
    else
    {
    System.out.println("CloseCnErr!");
    }
    }
    catch(Exception e)
    {
    System.out.println(e.getMessage());
    } }
    }
      

  7.   

    就是在:rtn=jdbc.CloseCN();这里。
      

  8.   

    在class中声明了全局变量后就不要在方法中在定义局部变量了
    Connection Scn = DriverManager.getConnection(url,user,password);
    改为Scn = DriverManager.getConnection(url,user,password);
      

  9.   

    好像是
    JDBCOBJ.CloseCN()

    Scn.close();
    出错
      

  10.   

    因为你没有给class的全局变量赋值,然后你又去用它当然空指针了
      

  11.   


    谢谢piaopiao11()!!
    问题都搞定了!