java.sql.SQLException: не удалось заблокировать таблицу «change»;в настоящее время используется пользователем - PullRequest
0 голосов
/ 04 января 2012

Вот моя проблема, я написал программу на концепции jdbc, все было хорошо, она компилируется и работает без ошибок.где возникает проблема, так как мне нужно изменить значения строки, удалив предыдущую строку (так как таблица содержит только одну строку), и нужно добавить столбец, если требуется с помощью программы, эти обе операции были успешными, только когда одна из них выполнена.

Но так как эти две операции были выполнены на одном кадре.Когда я изменил строки, после успешного обновления строки я не могу вставить новый столбец.И когда я пытаюсь вставить столбец, он показывает ошибку, как

java.sql.SQlException:[Micros​oft][ODBC Micro Access Driver] Could not
 lock table 'change' ; currently in use by user 'admin' on 'machine
 chiru-pc

, здесь «изменение» - это таблица, в которой выполняются эти изменения.

Может кто-нибудь понять, как можноисправить эту ошибку?




вот код, который я использовал

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.event.*;
    import java.sql.*;
    import java.io.*;
    import java.util.*;

    class Change extends JFrame implements ActionListener
    {
JButton done,ok,add;
JLabel[] c = new JLabel[50]; 
JLabel[] o = new JLabel[50]; 
JLabel lsx,lad,ln,lo,lc,la;
JTextField[] tf = new JTextField[50];
JTextField t;
int i=0,noc=0,d,h=0;
int[] e=new int[50];
String s;
Connection con; 

 public Change()
        {
        try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}
        catch(ClassNotFoundException ce){System.out.println(ce);}
        try{con=DriverManager.getConnection("jdbc:odbc:TAILORING");
        Statement st=con.createStatement();
        Dimension screensize =Toolkit.getDefaultToolkit().getScreenSize();
        setBounds(0,0,screensize.width,screensize.height);
            setTitle("STITCHING COST DETAILS"); 
                setLayout(null);  
        setVisible(true);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        ResultSet rs=st.executeQuery("select * from change");
        ResultSetMetaData r=rs.getMetaData();
        noc=r.getColumnCount();
        done=new JButton("DONE");
        ok=new JButton("OK");
        add=new JButton("ADD");
        t=new JTextField(50);
        for(i=1;i<=noc;i++){c[i] =new JLabel();}
        for(i=1;i<=noc;i++){o[i] =new JLabel();}
        for(i=1;i<=noc;i++){tf[i] =new JTextField(30);}
        for(i=1;i<=noc;i++){c[i].setText(r.getColumnName(i));c[i].setFont(new Font("Narkisim",Font.ITALIC,20));}
        ResultSet ra=st.executeQuery("select * from change");
        while(ra.next())
            {
                if(d==0){for(i=1;i<=noc;i++){o[i].setText(String.valueOf(ra.getInt(i)));o[i].setFont(new Font("Narkisim",Font.ITALIC,20));}}
                d++;
            }
        lad= new JLabel("SRIHARIPURAM,VISAKHAPATNAM-11  ////  MASTER: CH. SRI RAMAKRISHNA");
        lad.setFont(new Font("Narkisim",Font.ITALIC,15));
        lsx=new JLabel("SUNNEX TAILORS");
        lsx.setFont(new Font("Algerian",Font.ITALIC,80));
        lc= new JLabel("COSTUME LIST");
        lc.setFont(new Font("Narkisim",Font.ITALIC,15));
        lo= new JLabel("OLD RATES");
        lo.setFont(new Font("Narkisim",Font.ITALIC,15));
        ln= new JLabel("NEW RATES");
        ln.setFont(new Font("Narkisim",Font.ITALIC,15));
        la= new JLabel("ADD NEW COSTUME");
        la.setFont(new Font("Narkisim",Font.ITALIC,15));
        add(lsx,(screensize.width/3)-(screensize.width/25),(screensize.height/25),710,100);
        add(lad,(screensize.width/3),(screensize.height/8),610,40);
        add(lc,(screensize.width/5),180,100,20);
        add(lo,(screensize.width/3),180,610,20);
        add(ln,(screensize.width/2),180,610,20);
        add(done,(screensize.width/2)+(screensize.width/6),(screensize.height/3),100,20);
        add(ok,(screensize.width/2),(screensize.height)-(screensize.height/7),100,20);
        add(add,(screensize.width/4),(screensize.height)-(screensize.height/7),100,20);
        add(t,(screensize.width/4),(screensize.height)-(screensize.height/5),100,20);
        add(la,(screensize.width/4),(screensize.height)-(screensize.height/4),200,20);
        for(i=1;i<=noc;i++)
            {
                add(c[i],(screensize.width/5),(200+(30*i)),100,20);
            }
        for(i=1;i<=noc;i++)
            {
                add(o[i],(screensize.width/3),(200+(30*i)),100,20);
            }
        for(i=1;i<=noc;i++)
            {
                add(tf[i],(screensize.width/2),(200+(30*i)),100,20);
            }
            add.addActionListener(this);
            ok.addActionListener(this);
            done.addActionListener(this);
        }catch(SQLException ce){System.out.println(ce);}
    }
public void add(JComponent c,int x,int y,int w,int h)
    {
        c.setBounds(x,y,w,h);
            add(c);
    }
public void actionPerformed(ActionEvent ae)
    {
        if(ae.getSource() ==ok)
            {   
                setVisible(false);  
                Tailoring t=new Tailoring();
            }
        if(ae.getSource() ==add)
            {
                setVisible(false);
                Add a=new Add();

            }
        if(ae.getSource() ==done)
            {   

                try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}
                catch(ClassNotFoundException ce){System.out.println(ce);}
                try{con=DriverManager.getConnection("jdbc:odbc:TAILORING");
                Statement st=con.createStatement();d=0;
            ResultSet ra=st.executeQuery("select * from change");
            while(ra.next())
            {
                if(d==0)
                {for(i=1;i<=noc;i++)
                    {
                    if(h==0){s=(Integer.parseInt(tf[i].getText())+",");}
                    else if(h==(noc-1)){s+=(Integer.parseInt(tf[i].getText()));}
                    else if(h!=0 && h!=noc){s+=(Integer.parseInt(tf[i].getText())+",");}
                    h++;
                    }d++;
                }
            }
            st.execute
            (
                "DELETE FROM change"
            );
                st.execute
                (
                    "insert into change values("+s+")"
                );

                }catch(SQLException ce){System.out.println(ce);}
                try {Thread.sleep(500);}
                catch(InterruptedException e){}
                setVisible(false);
                Change c=new Change();
            }
        }
}

здесь это изменение класса является подклассом, а не основным классом

Ответы [ 4 ]

0 голосов
/ 13 января 2012

я создал новый класс Add, в котором я могу добавить необходимое количество столбцов одним щелчком мыши, мне это удалось, теперь на нем не отображается сообщение об ошибке.

0 голосов
/ 04 января 2012

Вы должны зафиксировать ваши изменения до попытки запустить ваш DDL, т.е. добавить новый столбец в таблицу.

0 голосов
/ 04 января 2012

В командной строке mysql попробуйте выполнить:

show full processlist;

и найдите процесс, который может удерживать блокировку на вашем столе.

Если вы найдете его и хотите его убить, обратите внимание на столбец id. Вы можете сделать одну из двух вещей:

  • Разрушить соединение и все, что он делает: kill number_in_id_column
  • Завершить запрос (но оставить соединение без изменений): kill query number_in_id_column
0 голосов
/ 04 января 2012

Кажется, вы вошли в одну и ту же базу данных / таблицу, используя роль администратора через GUI. Выйдите из GUI и снова запустите вашу программу.

...