0

のデータベースからのデータを表示しようとしていますJTable

これはActionListener私のメインクラスの一部です...

if(e.getSource()==jjb)
{
    String j[] = null;
    Vector r = new Vector();
    Vector finl = new Vector();
    try
    {
        d10.connection();
        int b = d10.getclmncnt();
        for(int g = 1; g<=b+1;g++)
        {
            j = new String[g];

        }
        for(int g = 1; g<=b;g++)
        {
            j[g] = d10.gettableclmn(g);
        }
        Vector v = new Vector();
        for(int g = 1; g<=b;g++)
        {
            v.addElement(j[g]);
        }
        int a = d10.getrwcnt();
        System.out.println("no of rows are   ::::  "+a);

        r = d10.getalldata(b);

        JTable t = new JTable(r,v);
        t.setLayout(null);
        TableColumn tc;
        for(int hh = 0;hh<t.getColumnCount();hh++)
        {               
            tc = t.getColumnModel().getColumn(hh);
            tc.setWidth(75);
        }
        JScrollPane js = new JScrollPane(t);

        js.setBounds(10, 100, 1000, 500);
        p5.add(js);
        p5.repaint();
    }
    catch (ClassNotFoundException e1)
    {
        e1.printStackTrace();
    }
    catch (SQLException e1)
    {
        e1.printStackTrace();
    }
}

これはデータベースに接続するための私のクラスです...

public void connection()throws SQLException, ClassNotFoundException
{
    Class.forName("oracle.jdbc.driver.OracleDriver");
    System.out.println("Driver Loaded");
    Properties p = new Properties();
    p.setProperty("user","system");
    p.setProperty("password", "oracle10");
    p.setProperty("url","jdbc:oracle:thin:@Suneel-PC:1521:XE");
    c = DriverManager.getConnection(p.getProperty("url"),p.getProperty("user"),p.getProperty("password"));
    System.out.println("connected");
}

public String gettableclmn(int b2)
{
    String s = null;
    int fh = b2;
    try
    {
        Statement ss = c.createStatement();
        ResultSet rs = ss.executeQuery("select * from data");
        ResultSetMetaData rsmd = rs.getMetaData();
        s = rsmd.getColumnName(fh);
        System.out.println("columns names are     "+rsmd.getColumnName(fh));        
    }
    catch (SQLException e)
    {
        e.printStackTrace();
    }

    return s;
}

public int getclmncnt()
{
    int h = 0;

    ResultSetMetaData rsmd;
    try {
        Statement ss = c.createStatement();
        ResultSet rs = ss.executeQuery("select * from data");
        rsmd = rs.getMetaData();
        h = rsmd.getColumnCount();
    }
    catch (SQLException e)
    {
        e.printStackTrace();
    }

    return h;
}

public Vector getalldata(int b)
{
    int d = b;
    String j = null;
    Vector rr  = new Vector();
    Vector v = new Vector(d);
    try
    {
        Statement s = c.createStatement();
        ResultSet r = s.executeQuery("select * from data");

        while(r.next())
        {
            v.add(r.getInt(1));
            v.add(r.getInt(2));
            v.add(r.getInt(3));
            v.add(r.getInt(4));
            v.add(r.getInt(5));
            v.add(r.getInt(6));
            v.add(r.getInt(7));
            v.add(r.getInt(8));
            v.add(r.getInt(9));
            v.add(r.getInt(10));
            v.add(r.getInt(11));
            v.add(r.getString(12));
        }
        rr.add(v);
    }
    catch (SQLException e)
    {
        e.printStackTrace();
    }

    return rr;
}

public int getrwcnt()
{
    ResultSet r;
    int j = 0;
    try
    {
        Statement s = c.createStatement();
        r = s.executeQuery("select count (*) from data");
        r.next();
        j = r.getInt(1);
    }
    catch (SQLException e)
    {
        e.printStackTrace();
    }

    return j;
}

このコードを実行すると、最初の結果のみがに表示されますがJTable、呼び出すと、行function d10.getrwcnt();として出力されます。79私のコードの問題は何ですか?

4

3 に答える 3

1

あなたの問題はgetalldataメソッドのループです。

Vector v = new Vector(d);
    try {

        Statement s = c.createStatement();
        ResultSet r = s.executeQuery("select * from data");

        while(r.next()) 
        //Every time when this loop gets executed you are adding
        //data to the same vector v, instead one instance depicts one row in database,
        //so you will have to create a new instance everytime.
        {
            v = new Vector(d); //create an instance for every row in database.
            v.add(r.getInt(1));
            v.add(r.getInt(2));
            v.add(r.getInt(3));
            v.add(r.getInt(4));
            v.add(r.getInt(5));
            v.add(r.getInt(6));
            v.add(r.getInt(7));
            v.add(r.getInt(8));
            v.add(r.getInt(9));
            v.add(r.getInt(10));
            v.add(r.getInt(11));
            v.add(r.getString(12));
            rr.add(v); // add the values here
        }



    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
于 2012-05-30T08:24:34.097 に答える
1

最初の行と最後の行を移動し、

    Vector v = new Vector(d);
    .... 
    while(r.next()) {
        v.add(r.getInt(1));
        v.add(r.getInt(2));
        ...
        v.add(r.getString(12));
    }

    rr.add(v);

ループ内では、次のように、

    while(r.next()) {
        Vector v = new Vector(d);
        v.add(r.getInt(1));
        v.add(r.getInt(2));
        ...
        v.add(r.getString(12));

        rr.add(v);
    }

さらに、あなたのコードはかなりFUBARであることがわかります、気にしないでください。あなたはいくつかのことをすることができます、

  • 接続を適切に処理し、接続プールAPIを使用してみてください
  • resultSet使用後は閉じてください
  • 使用をやめ、代わりにVector使用しArrayListます。特に、Vectorが目的を果たさない場合は使用します。
  • Java命名規則に準拠するようにしてください
  • 、などではなくb、意味のある変数を使用してください。gj
于 2012-05-30T08:27:45.373 に答える
1

あなたがフォローについて何かを検索しなかったので、ポイントだけ

  • ベクターのしくみ

  • JTableのしくみ

  • LayotManagersのしくみ

  • 関連する質問を読む(右下)

  • 車輪の再発明をしないで、ResultSetTableModelまたはTableFromDatabaseを検索してください

  • Swingの同時実行性に問題があります

于 2012-05-30T08:47:26.653 に答える