2012-01-04 6 views
0

ここに私の問題があります.jdbcのコンセプトに関するプログラムはすべてコンパイルされ、エラーなく実行されます。どこで問題が発生するのかというと、私は行の値を変更する必要があるので、前の行(テーブルには1行しか含まれていない)を削除し、必要に応じて列を追加する必要があります。完了しました。java.sql.SQLException: 'change'テーブルをロックできませんでした。現在ユーザーが使用しています

しかし、これらの2つの操作は同じフレームで行われました。行の変更が成功した後、行の更新が成功した後、私は新しい列を挿入できません。私はここに

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

答えて

0

サブクラスであるとされていないあなたが同じにログインしているようですGUIを介して管理者ロールを使用するデータベース/テーブルGUIからログオフし、プログラムを再度実行してください。

+0

5列を挿入する必要がある場合は、5回GUIを閉じる必要がある場合は、列数を増やす必要があると思われます。 – chiranjeevi

+0

同じテーブルがmsアクセスデータベースから開かれている間は、テーブルの変更を行うことはできません。 – kosa

+0

GUIを閉じずにコードを使用してデータベースを閉じて再オープンすることができます – chiranjeevi

0

DDLを実行する、つまり新しい列をテーブルに追加する前に、変更内容をコミットする必要があります。

+0

こんにちはanubhav屋のように私はそれが動作するが、私はどちらかの方法で行う必要がある - 列を挿入した後に行を追加する行を挿入した後 – chiranjeevi

+0

あなたはすべての書き込みを行うことができます(INSERT、UPDATE、DELETE)しかし、間にCOMMITする必要はありませんが、以前の書き込みのためにテーブルがロックされるべきではないテーブルに新しい列を追加するためには、だから私は最初に列を追加し、あなたのテーブルに書き込み操作を実行することをお勧めします。 – anubhava

+0

kは、あなたが質問をタグ付けしているのはなぜ私は意味アクセスとして私はそれを知ることができますどのように私のプログラムでデータベースとしてロック – chiranjeevi

0

mysqlコマンドラインから、実行してみてください:

show full processlist; 

し、あなたのテーブルの上にロックを保持しているかもしれないプロセスを探します。

見つかった場合は、それを削除するには、idの列に注意してください。 kill number_in_id_column

  • キルクエリ(無傷の接続を残して)::

    • キル接続し、何もそのやって:あなたは、2つのいずれかを行うことができますkill query number_in_id_column
  • +0

    ボヘミアンロックを解除するための他のオプションが存在しない、uはanubhav感謝します'mysql'タグは' msアクセス 'のようですね。あなたはタグに注意する必要があります!だから、** mysqlの質問ではありませんか? – chiranjeevi

    +0

    を保持しているものをミリ秒のアクセスを使用していますテーブル – Bohemian

    +0

    申し訳ありませんが私は今行う。 – chiranjeevi

    0

    私は新しいクラスの追加を作成しました1クリックで必要な数の列を追加することができます。これを行うことで成功しました。今は、投稿したエラーを表示しません。

    関連する問題