java.sql.SQLException:无法锁定表'更改';目前由用户使用

时间:2012-01-04 04:45:04

标签: java swing ms-access ms-access-2003 sqlexception

这是我的问题,我写了一个关于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

这里'change'是完成这些改动的表。

任何人都可以清楚我如何纠正这个错误?




这是我使用的代码

    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 :(得分:0)

您似乎使用管理员角色通过GUI登录到同一个数据库/表。从GUI注销并再次运行程序。

答案 1 :(得分:0)

在尝试运行DDL之前,您应该提交您的更改,即在表格中添加新列。

答案 2 :(得分:0)

从mysql命令行,尝试执行:

show full processlist;

并查找可能锁定桌面的进程。

如果您找到一个,并且想要将其删除,请记下id列。你可以做以下两件事之一:

  • 终止连接及其所做的任何事情:kill number_in_id_column
  • 终止查询(但保持连接完好无损):kill query number_in_id_column

答案 3 :(得分:0)

我创建了一个新类添加,我可以在一次点击中添加所需数量的列,我成功完成此操作,现在它没有显示我发布的错误。