2012-01-04 80 views
0

这是我的问题,我写了一个关于jdbc概念的程序,一切都很好,它编译并运行没有错误。因为我需要通过删除 前一行(因为该表只包含一行)需要更改行的值,并且需要使用该程序添加列(如果需要),这两个操作都是成功的,只有当任何一个完成。java.sql.SQLException:无法锁定表'更改';目前由用户使用

但是,这两个操作是在同一帧上完成的。当我更改行时,在成功更新行之后,我无法插入新列。当我试图插入列它显示一个错误,因为

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(); 
      } 
     } 
} 

这里该类变化的一个子类,而不是主类

+0

我们需要精确简洁的代码。 – Lion 2012-01-04 05:00:46

回答

0

看来你登录到同一代码通过GUI使用管理员角色的数据库/表。从GUI注销并再次运行您的程序。

+0

它似乎是一个问题,当我需要插入更多数量的列时,如果要插入5列,我必须关闭GUI 5次。 – chiranjeevi 2012-01-05 04:33:01

+0

从ms访问数据库打开同一个表时,无法对表进行任何修改。 – kosa 2012-01-05 04:44:01

+0

我可以关闭并重新打开数据库使用一些编码,而不关闭gui – chiranjeevi 2012-01-05 05:17:42

0

在尝试运行DDL之前,您应该先承诺您的更改即向表中添加新列。

+0

嗨anubhav亚,因为你说它的工作原理,但我需要他们以任何方式完成 - 插入行后插入列或列后添加行 – chiranjeevi 2012-01-05 04:30:08

+0

您可以在同一事务中执行所有写入数据库(INSERT,UPDATE,DELETE)不需要在两者之间进行COMMIT操作,但是为了在某个表中添加一个新的列,该表不应该被锁定,这是因为您之前的写入。所以我建议你先添加列,然后对你的表执行WRITE操作。 – anubhava 2012-01-05 04:59:05

+0

k谢谢你anubhav,那么没有其他选项来解锁表 – chiranjeevi 2012-01-05 05:15:51

0

从MySQL命令行中,尝试执行:

show full processlist; 

,并寻找可能持有的表锁的进程。

如果找到一个,并且想要杀死它,请注意id列。你可以做两件事情之一:

  • 杀死的连接和任何其这样做的:kill number_in_id_column
  • 杀死查询(但保持连接完好):kill query number_in_id_column
+0

波希米亚我在我的程序中使用ms访问作为数据库我如何知道它作为访问我的意思是持有锁 – chiranjeevi 2012-01-05 04:27:11

+0

为什么你标记了问题用'mysql'标签看起来是个'ms access'问题?!你必须小心标签!那么,这是**不是**一个MySQL问题? – Bohemian 2012-01-05 05:47:00

+0

对不起,先生,我现在做。 – chiranjeevi 2012-01-05 05:50:46

0

我创建了一个新的类添加我可以在一次点击中添加所需数量的列,我成功地做到了这一点,现在它不显示我发布的错误。