2012-01-04 19 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

我創建了一個新的類添加我可以在一次點擊中添加所需數量的列,我成功地做到了這一點,現在它不顯示我發佈的錯誤。