0

システムを設計し、最初にコンボボックスから挿入するテーブルの名前を選択してから、残りのフィールドに入力するようにします。私の質問は、ユーザーに名前を入力させる方法です。 sqlステートメントを使用したテーブルの..次のように記述しますが、機能しませんか?

 try { 
            Object service = Service_ComboBox.getSelectedItem(); 
            String ref = "0";  
            String title = title_TextField1.getText(); 
            Object riskRating = riskRating_ComboBox3.getSelectedItem();
            Object rootCause = rootCause_ComboBox4.getSelectedItem(); 
            Object impact = impact_ComboBox1.getSelectedItem(); 
            Object likelihood = likelihood_ComboBox2.getSelectedItem(); 
            String efforts = efforts_TextField7.getText(); 
            String finding = finding_TextField9.getText(); 
            String implication = implication_TextArea1.getText(); 
            String recommendation = recommendation_TextArea2.getText(); 

          Connection  conn= DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:XE","SYSTEM","*******");
             String query = "insert into ? (Service,Ref,Title,Risk_Rating,Root_cause,Impact ,Likelihood,Efforts,Finding,Implication,Recommendation)values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? , ?)"; 

         PreparedStatement myStatment = conn.prepareStatement(query);

            myStatment.clearParameters();

     myStatment.setString(1, service.toString());
     myStatment.setString(2, service.toString());
     myStatment.setString(3, ref);
     myStatment.setString(4, title); 
     myStatment.setString(5, riskRating.toString());
     myStatment.setString(6, rootCause.toString());
     myStatment.setString(7, impact.toString());
     myStatment.setString(8, likelihood.toString());
     myStatment.setString(9, efforts);
     myStatment.setString(10, finding);
     myStatment.setString(11, implication);
     myStatment.setString(12, recommendation);


            boolean myResult = myStatment.execute(); 


           System.out.println("done");


        } catch (SQLException ex) {

            JOptionPane.showMessageDialog(this, "Information is missing or incorrect! Please Make sure to enter correct information");
            Logger.getLogger(Insert_info.class.getName()).log(Level.SEVERE, null, ex);
            return;

        }

        JOptionPane.showMessageDialog(this, "Your information was saved successfully!");
4

2 に答える 2

0

次の構文を使用します。

String query = "insert into " &tablename "bla bla predicates"

SQL インジェクションを回避するには、データベースにロールを作成し、訪問者/ユーザーが使用するテーブルへのアクセスを許可します。
または、ワイルドカードを使用することもできます:
変数 tbl_name の作成

String query = "insert into "(select table_name from user_tables where table_name like '%tbl_name%')"<br/>

- 次に、ディシジョン「IF」を作成し、ワイルドカードの出力をスローします。それがテーブルと一致する場合、そうでない場合はエラー メッセージで処理します。

于 2012-07-19T13:20:05.313 に答える
0
insert into ?

スキーマ オブジェクト名にバインド変数を使用することはできません。その理由は、ステートメントを準備するときに、データベースはどのテーブルが関係しているかを知り、どのインデックスを使用するかを決定する必要があるため、クエリ SQL を知る必要があるためです (変更できるのはデータのみです)。

したがって、これを行う場合は、文字列補間を使用してクエリを作成する必要があります (テーブル名についてのみ、データには引き続きバインド変数を使用してください!)。

String query = "insert into "+ tableName + ....

これを確認してくださいtableName。あなたの場合、おそらく有効なテーブル名の HashSet に対してチェックできます。これを SQL インジェクションの問題にしないでください。

于 2012-07-19T12:50:34.403 に答える