2012-03-05 23 views
2

在下面的C++代码中,我正在根据搜索值更新emp表的字段。但是这个代码工作不正常。我输出为中止。如何添加字段名作为OCCI中的变量

void UpdateData(string field_name,string updated_value,string search_value) 
{ 
    stmt->createStatement("UPDATE emp SET :1=:2 where search=:3"); 
    stmt->setString(1,field_name); 
    stmt->setString(2,updated_value); 
    stmt->setString(3,search_value); 
    stmt->executeUpdate(); 
} 

在我的程序用户将选择他们哪个字段更新和所选字段名被传递到功能FIELD_NAME参数。 updated_value是用户输入的新值,而search_value是查找适当记录的搜索关键字。

如果我喜欢 stmt-> createStatement(“UPDATE emp SET field_name =:2 where search =:3”);

其工作..

但问题是,字段名称会根据用户选择更换。我如何克服这个问题。有没有其他方法?

回答

2

您不能使用statement->setString()方法设置字段的名称;只有变量的值可以像这样绑定。 我知道,只有两个解决方案来实现这一点(这两个不是特别漂亮):

  1. 动态创建语句字符串

    string statement ="UPDATE emp SET " + fieldname + "=:1 where search=:2"; 
    
  2. 准备个人陈述,每一个影响外地和选择运行时

    const string STATEMENT_FIELD_CITY = "UPDATE emp SET CITY=:1 where search=:2"; 
    const string STATEMENT_FIELD_LAND = "UPDATE emp SET LAND=:1 where search=:2"; 
    
+0

第二种方法,而更繁琐,更SECUR因为可能的字符串集在编译时很可能已知。如果你最终选择了第一种方法,那么在使用这样的语句之前,确保你检查了'fieldname'的内容! Prepared语句执行转义和其他类型的验证,但是由于您正在从一些(可能)未知的数据构建基本字符串,因此您仍然容易受到SQL注入的攻击。 – 2012-03-05 19:14:42

+0

第二种方法还有一个好处,即它更有可能被数据库系统缓存,因为它是_fixed_,即只有绑定变量的值更改*而不是语句本身。 – 2012-03-05 19:22:47

相关问题