首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将新数据插入数据库中的特定表中

将新数据插入数据库中的特定表中
EN

Stack Overflow用户
提问于 2012-07-19 20:38:16
回答 2查看 259关注 0票数 0

我设计了一个系统,我想让用户首先从一个组合框中选择他想要插入的表格的名称,然后他将输入其余的字段。我的问题是,如何让用户使用SQL语句输入表的名称。我写了下面的内容,但是它不能工作??

代码语言:javascript
复制
 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!");
EN

回答 2

Stack Overflow用户

发布于 2012-07-19 20:50:34

代码语言:javascript
复制
insert into ?

不能对架构对象名称使用绑定变量。原因是,当您准备语句时,数据库需要知道涉及哪些表,并决定使用哪些索引,因此查询SQL需要是已知的(只有数据可以更改)。

因此,如果您想要这样做,您必须使用字符串插值来构造查询(仅对于表名,继续对数据使用绑定变量!)。

代码语言:javascript
复制
String query = "insert into "+ tableName + ....

请确保验证此tableName。在您的例子中,可能可以根据有效表名的HashSet进行检查。不要让这成为SQL注入问题。

票数 0
EN

Stack Overflow用户

发布于 2012-07-19 21:20:05

使用下面的sintax:

代码语言:javascript
复制
String query = "insert into " &tablename "bla bla predicates"

要避免sql注入,请在数据库中创建角色,并为访问者/用户提供对希望使用的表的访问权限。

或者您可以使用通配符:

创建一个变量tbl_name

代码语言:javascript
复制
String query = "insert into "(select table_name from user_tables where table_name like '%tbl_name%')"<br/>

  • 接下来创建一个判定" if“,并在it.If中抛出通配符的输出。它与您已有的表匹配,如果不匹配,则确定,并显示错误消息。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11561057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档