Abertura de varias tabelas

4 respostas
R

Bom dia pessoal;

Estou desenvolvendo um sistema “java application” pelo Netbeans 6.9.1 for Windows.

Executando entro do IDE, funciona perfeitamente.
Teoricamente está pronto o sistema.

Nesta aplicação, em uma determinada janela, preciso ler várias tabelas em algum momento (aproximadamente 3 tabelas).

Só que ao executar fora do Netbeans, ao executar uma determinada rotina, recebo a informação “Cannot open any more tables”.
Como resolver este problema ?

Estou usando o access 2007 como BD, pois na empresa onde trabalho, não nos permite trabalho com outro.

Minha conexão:

package utilitarios;

import java.sql.*;
import javax.swing.*;

public class Conexao
{
    final private String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
    final private String DBQ = "Match.mdb";
    final private String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+DBQ;
    final private String usuario = "";
    final private String senha = "";

    public Connection conexao;
    public Statement statement;
    public ResultSet resultset;

    public boolean conecta()
    {
        boolean result = true;
        try
        {
            Class.forName(driver);
            conexao = DriverManager.getConnection(url, usuario, senha);
        } catch(ClassNotFoundException Driver)
        {
            JOptionPane.showMessageDialog(null,"Driver not found: "+Driver);
            result = false;
        } catch (SQLException Fonte)
        {
            JOptionPane.showMessageDialog(null,"Erro in conection with database: "+ Fonte);
            result = false;
        }
        return result;
    }

    public void desconecta()
    {
        boolean result = true;
        try
        {
            conexao.close();
//            JOptionPane.showMessageDialog(null,"Banco fechado.");
        } catch (SQLException erroSQL)
        {
            JOptionPane.showMessageDialog(null, "Could not close that pack database: "+erroSQL.getMessage());
            result = false;
        }
    }

    public void executeSQL(String sql)
    {
        try
        {
            statement = conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
//            statement = conexao.createStatement();
            resultset = statement.executeQuery(sql);
        } catch(SQLException sqlex)
        {
            JOptionPane.showMessageDialog(null, "Could not execute sql command. " + sqlex+"\nThe sql command was: "+sql);
        }
    }
}

Abaixo tem uma parte da rotina onde provavelmente está causando a mensagem:

private void Busca_Refugio()
    {
        RefTotPos = 0;
        RefTotVol = 0;
        RefTotHy = 0;

        int TotHy = 0;
        int TotPr = 0;

        int vlrProd = 0;
        int vlrRefNes = 0;
        DecimalFormat df = new DecimalFormat("0");
        String sql = "";

        try
        {
            sql = "SELECT SUM(VOLUME_PROGRAMADO), SUM(VOLUME_A_PRODUZIR - VOLUME_PRODUZIDO) FROM MC_PRODUZIR WHERE HIBRIDO IN " +
                      "(SELECT HIBRIDO FROM MCXREFUGIO WHERE REFUGIO='"+refugioEmUso+"')";
            rs.executeSQL(sql);
            rs.resultset.next();
            TotHy = rs.resultset.getInt(1);
            TotPr = rs.resultset.getInt(2);

            rs.statement.executeUpdate("DROP TABLE TEMPDISTREF");

            rs.statement.executeUpdate("SELECT ID_SITE, REFUGIO, ID_MM, (VOLUME - VOLUME_CONSUMIDO) as VOL, " +
                                                   "0 AS DISTRIBUIDO " +
                                       "INTO TEMPDISTREF " +
                                       "FROM REFUGIO_PRODUZIDO "+
                                       "WHERE REFUGIO='"+refugioEmUso+"'");

            sql = "UPDATE MC_PRODUZIR SET REFUGIO_1OP=0, REFUGIO_2OP=0, REFUGIO_3OP=0 " +
                    "WHERE HIBRIDO IN (SELECT HIBRIDO FROM MCXREFUGIO WHERE REFUGIO='"+refugioEmUso+"')";
            rs.statement.executeUpdate(sql);

            for (int indice=1; indice < 4; indice++)
            {
                PreparedStatement stms = 
                        rs.conexao.prepareStatement("SELECT MC.*, MR.PRIORIDADE_OPERACAO "+
                                                    "FROM MC_PRODUZIR AS MC " +
                                                    "INNER JOIN MCXREFUGIO AS MR ON MR.HIBRIDO=MC.HIBRIDO "+
                                                    "WHERE MC.HIBRIDO IN " +
                                                    "(SELECT HIBRIDO FROM MCxREFUGIO WHERE REFUGIO='"+refugioEmUso+"') " +
                                                    "ORDER BY MR.PRIORIDADE_OPERACAO, MC.HIBRIDO");
                ResultSet rss = stms.executeQuery();

                while (rss.next())
                {
                    String hy = rss.getString("Hibrido");
                    int idmm = rss.getInt("ID_MM");
                    int vap = rss.getInt("Volume_a_Produzir");
                    int vp = rss.getInt("Volume_Produzido");
                    int r1 = rss.getInt("Refugio_1op");
                    int r2 = rss.getInt("Refugio_2op");
                    int r3 = rss.getInt("Refugio_3op");

                    Double percRef = Pega_Perc_Refugio_Trait(hy);

                    vlrProd = vap - vp;
                    vlrProd += (int) Math.round((((double) vlrProd * MargemSeg)));

                    vlrRefNes = (int) Math.round((((double) vlrProd * percRef))+0.4d);
                    vlrRefNes -= (r1 + r2 + r3);

                    if (vlrRefNes > 0)
                    {
                        if (indice == 1)
                           vlrRefNes = Calcula_Opcao1(vlrProd, vlrRefNes, hy, idmm);
                        if (indice == 2)
                           vlrRefNes = Calcula_Opcao2(vlrProd, vlrRefNes, hy, idmm);
                        if (indice == 3)
                           vlrRefNes = Calcula_Opcao3(vlrProd, vlrRefNes, hy, idmm);
                    }
                }
//                stms.close();
            }

        } catch (SQLException e) {}

        df = new DecimalFormat("#,##0");

        lTotHy.setText(df.format(TotHy));
        lTotProd.setText(df.format(TotPr));
        lRefTot.setText(df.format(RefTotPos));
        lVolRef.setText(df.format(RefTotVol));
        lVolRefHy.setText(df.format(RefTotHy));

        df = new DecimalFormat("0.0%");

        Double vlr1 = new Double(TotPr).doubleValue();
        Double vlr2 = new Double(TotHy).doubleValue();

        Double res = vlr1 / vlr2;

        lPercHy.setText(df.format(res));

        vlr1 = new Double(RefTotPos).doubleValue();
        vlr2 = new Double(TotPr).doubleValue();

        res = vlr1 / vlr2;

        lPercTot.setText(df.format(res));

        vlr1 = new Double(RefTotVol).doubleValue();
        vlr2 = new Double(RefTotHy).doubleValue();
        res = vlr1 / vlr2;

        lVolRefPerc.setText(df.format(res));
    }

    private int Calcula_Opcao1(int vlrProd, int vlrNes, String hibrido, int idmm)
    {
        int retorno = vlrNes;
        Double percRef = Pega_Perc_Refugio_Trait(hibrido);
        RefTotHy += vlrNes;

        try
        {
            rs.executeSQL("SELECT * FROM TEMPDISTREF WHERE ID_MM="+idmm);
            if (rs.resultset.next())
            {
                int dist = rs.resultset.getInt("Distribuido");
                int vol = rs.resultset.getInt("Vol");
                int vlr = vol - dist;

                String sql = "UPDATE MC_PRODUZIR SET ";
                String sql1 = "UPDATE TEMPDISTREF SET ";
                if (vlrNes > vlr)
                {
                    retorno = vlrNes - vlr;
                    dist += vlr;
                    RefTotPos += (int) Math.round(((double)vlr/percRef)+0.4d);
                    RefTotVol += vlr;

                    sql += "REFUGIO_1op = "+vlr+", ";
                    sql1 += "DISTRIBUIDO = "+ dist +" ";
                } else
                {
                    retorno = 0;
                    dist += vlrNes;
                    RefTotPos += vlrProd;
                    RefTotVol += vlrNes;

                    sql += "REFUGIO_1op = "+vlrNes+", ";
                    sql1 += "DISTRIBUIDO = " + dist +" ";
                }
                sql += "REFUGIO_2op=0, REFUGIO_3op=0 WHERE ID_SITE=1 AND HIBRIDO='"+hibrido+"' and id_mm="+idmm;
                sql1 += "WHERE REFUGIO='" + refugioEmUso + "' AND ID_MM="+idmm;

                rs.statement.executeUpdate(sql);
                rs.statement.executeUpdate(sql1);
            } else
            {
                String sql = "UPDATE MC_PRODUZIR SET ";
                    sql += "REFUGIO_1op=0, REFUGIO_2op=0, REFUGIO_3op=0 " +
                           "WHERE ID_SITE=1 AND HIBRIDO='"+hibrido+"' and id_mm="+idmm;

                rs.statement.executeUpdate(sql);
            }

        } catch (SQLException e) {}

        return retorno;
    }

    private int Calcula_Opcao2(int vlrProd, int vlrNes, String hibrido, int idmm)
    {
        int retorno = vlrNes;
        int Nidmm = 0;
        Double percRef = Pega_Perc_Refugio_Trait(hibrido);
        RefTotHy += vlrNes;

        try
        {
            rs.executeSQL("SELECT * FROM MILIMETROS WHERE ID_MM="+idmm);
            rs.resultset.next();
            Double tamanho = rs.resultset.getDouble("Tamanho");
            String clas = rs.resultset.getString("Classificacao");

            if (tamanho > 9)
            {
                rs.executeSQL("SELECT * FROM MILIMETROS WHERE tamanho="+(tamanho - 0.5)+" and classificacao='"+clas+"'");
                if (rs.resultset.next())
                {
                    Nidmm = rs.resultset.getInt("ID_MM");

                    rs.executeSQL("SELECT * FROM TEMPDISTREF WHERE ID_MM="+Nidmm);
                    if (rs.resultset.next())
                    {
                        int dist = rs.resultset.getInt("Distribuido");
                        int vol = rs.resultset.getInt("Vol");
                        int vlr = vol - dist;

                        String sql = "UPDATE MC_PRODUZIR SET ";
                        String sql1 = "UPDATE TEMPDISTREF SET ";
                        if (vlrNes > vlr)
                        {
                            retorno = vlrNes - vlr;
                            dist += vlr;
                            RefTotPos += (int) Math.round(((double)vlr/percRef)+0.4d);
                            RefTotVol += vlr;

                            sql += "REFUGIO_2op = "+vlr+" ";
                            sql1 += "DISTRIBUIDO = "+ dist +" ";
                        } else
                        {
                            retorno = 0;
                            dist += vlrNes;
                            RefTotPos += vlrProd;
                            RefTotVol += vlrNes;

                            sql += "REFUGIO_2op = "+vlrNes+" ";
                            sql1 += "DISTRIBUIDO = "+ dist +" ";
                        }
                        sql += "WHERE ID_SITE=1 AND HIBRIDO='"+hibrido+"' and id_mm="+idmm;
                        sql1 += "WHERE REFUGIO='" + refugioEmUso + "' AND ID_MM="+Nidmm;

                        rs.statement.executeUpdate(sql);
                        rs.statement.executeUpdate(sql1);

                    }
                }
            }

        } catch (SQLException e) {}

        return retorno;
    }

    private int Calcula_Opcao3(int vlrProd, int vlrNes, String hibrido, int idmm)
    {
        int retorno = vlrNes;
        int Nidmm = 0;
        Double percRef = Pega_Perc_Refugio_Trait(hibrido);
        RefTotHy += vlrNes;

        try
        {
            rs.executeSQL("SELECT * FROM MILIMETROS WHERE ID_MM="+idmm);
            rs.resultset.next();
            Double tamanho = rs.resultset.getDouble("Tamanho");
            String clas = rs.resultset.getString("Classificacao");

            if (tamanho > 9.5)
            {
                rs.executeSQL("SELECT * FROM MILIMETROS WHERE tamanho="+(tamanho - 1)+" and classificacao='"+clas+"'");
                if (rs.resultset.next())
                {
                    Nidmm = rs.resultset.getInt("ID_MM");

                    rs.executeSQL("SELECT * FROM TEMPDISTREF WHERE ID_MM="+Nidmm);
                    if (rs.resultset.next())
                    {
                        int dist = rs.resultset.getInt("Distribuido");
                        int vol = rs.resultset.getInt("Vol");
                        int vlr = vol - dist;

                        String sql = "UPDATE MC_PRODUZIR SET ";
                        String sql1 = "UPDATE TEMPDISTREF SET ";
                        if (vlrNes > vlr)
                        {
                            retorno = vlrNes - vlr;
                            dist += vlr;
                            RefTotPos += (int) Math.round(((double)vlr/percRef)+0.4d);
                            RefTotVol += vlr;

                            sql += "REFUGIO_3op = "+vlr+" ";
                            sql1 += "DISTRIBUIDO = "+ dist +" ";
                        } else
                        {
                            retorno = 0;
                            dist += vlrNes;
                            RefTotPos += vlrProd;
                            RefTotVol += vlrNes;

                            sql += "REFUGIO_3op = "+vlrNes+" ";
                            sql1 += "DISTRIBUIDO = "+ dist +" ";
                        }
                        sql += "WHERE ID_SITE=1 AND HIBRIDO='"+hibrido+"' and id_mm="+idmm;
                        sql1 += "WHERE REFUGIO='" + refugioEmUso + "' AND ID_MM="+Nidmm;

                        rs.statement.executeUpdate(sql);
                        rs.statement.executeUpdate(sql1);
                    }
                }
            }

        } catch (SQLException e) {}

        return retorno;
    }

    private Double Pega_Perc_Refugio_Trait(String material)
    {
        Double resultado = 0.0;

        String trait="";
        Boolean entrounro=false;
        Boolean passounro=false;

        for (int cont=0;cont<material.length();cont++)
        {
            if (passounro)
                trait += material.substring(cont,cont+1);
            else
                if (!entrounro)
                {
                    if (material.substring(cont,cont+1).equals("0") ||
                        material.substring(cont,cont+1).equals("1") ||
                        material.substring(cont,cont+1).equals("2") ||
                        material.substring(cont,cont+1).equals("3") ||
                        material.substring(cont,cont+1).equals("4") ||
                        material.substring(cont,cont+1).equals("5") ||
                        material.substring(cont,cont+1).equals("6") ||
                        material.substring(cont,cont+1).equals("7") ||
                        material.substring(cont,cont+1).equals("8") ||
                        material.substring(cont,cont+1).equals("9"))
                        entrounro = true;
                } else
                    if (!material.substring(cont,cont+1).equals("0") &&
                        !material.substring(cont,cont+1).equals("1") &&
                        !material.substring(cont,cont+1).equals("2") &&
                        !material.substring(cont,cont+1).equals("3") &&
                        !material.substring(cont,cont+1).equals("4") &&
                        !material.substring(cont,cont+1).equals("5") &&
                        !material.substring(cont,cont+1).equals("6") &&
                        !material.substring(cont,cont+1).equals("7") &&
                        !material.substring(cont,cont+1).equals("8") &&
                        !material.substring(cont,cont+1).equals("9"))
                    {
                        trait = material.substring(cont,cont+1);
                        passounro = true;
                    }
        }

        if (!trait.equals(""))
        {
            rs.executeSQL("SELECT PERC_REFUGIO FROM PERC_REFUGIO WHERE TRAIT='"+trait+"'");
            try
            {
                if (rs.resultset.next())
                    resultado = rs.resultset.getDouble("Perc_Refugio");
            } catch (SQLException e)
            {
                JOptionPane.showMessageDialog(null, "Error in get % of Refuge.\nError: "+e);
            }
        }

        return resultado;
    }

4 Respostas

E
final private String DBQ = "Match.mdb";  
    final private String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+DBQ;

Quando você usa o parâmetro “DBQ”, você está especificando o nome do arquivo onde está o banco de dados.

Quando você roda fora do NetBeans, do jeito que você está rodando o programa, ele não está sabendo onde é que o arquivo de banco de dados está.

O normal é você passar o nome completo do arquivo (com diretório e tudo) como parâmetro (por exemplo, você poderia escolher esse arquivo através de um menu, ou então especificar o nome em um arquivo .properties, ou então passar como parâmetro de linha de comando).

Se você só escreve “Match.mdb” ele tenta localizar no diretório local (que nem sempre é o mesmo onde fica o jar - e é aí onde um monte de gente boa se estrumbica). Normalmente, para programas java, em vez de tentar achar uma solução para sempre deixar algum arquivo de configuração ou de banco no mesmo diretório do Jar, é mais correto guardar isso como configuração.

Procure por “Preferences API” para ver como é que você pode guardar uma configuração no registry - assim você pode criar uma tela em que a configuração fica persistente de uma rodada para outra do seu programa.

http://docs.oracle.com/javase/1.4.2/docs/guide/lang/preferences.html

R

entanglement,
obrigado pela dica,

mas não é isto que está acontecendo.
Coloquei o caminho completo, o problema persiste.

Me parece que ao fazer vários “selects” em momentos diferentes, é como se estourase a memória, ou tivesse um limite de consultas e atualizações.
Não sei o que está acontecendo.

Se alguém tiver alguma dica ou já passou por este problema …

Obrigado.

R

Consegui resolver o meu problema.

O que fiz, não sei se é a maneira correta mas funcionou, foi criar um outro recordset para distribuir as leituras.

Conexao rs1 = new Conexao();
Conexao rs2 = rs1;

rs1.conecta();
rs2.conecta();

Está funcionando uma maravilha.

Obrigado pelo suporte.

E
Conexao rs1 = new Conexao();
Conexao rs2 = rs1;

Hum - isso não é criar um novo objeto Conexão mas sim só usar mais uma referência ao mesmo objeto Conexão.

Não analisei seu programa, mas uma coisa que é bom evitar é usar variáveis “rs1, rs2, rss” que você acaba esquecendo de apagar ou então se confunde quando vai usar o 1 ou o 2.
Use uns nomes menos bagunçados - até porque rs seria um ResultSet, não uma Conexão, certo? Talvez um objeto Conexão possa ser referenciado por uma variãvel cnx, ou coisa parecida.

Criado 27 de outubro de 2012
Ultima resposta 27 de out. de 2012
Respostas 4
Participantes 2