我认为你可以猜测的问题,我有。我在插入的文件名为sql数据库在C++的建设者。有些文件具有一撇在他们的名字。这符sql插入查询。通常的办法来解决这个问题是双动和撇你想要被领域的一部分的价值。

例如,如果我要添加'乔治'到场"所有者"sql query将"insert into table(拥有者)values('乔治"s')"

我确定这一点。我只需要拿到单省略号取代有双重的。AnsiString似乎没有一个建立在功能这一点。是有一个简单的方法来做到这一点,而无需要包括一个全新的头文件?

有帮助吗?

解决方案

其实我自己得到了答案......

item = StringReplace( item, "'", "''", TReplaceFlags() <<rfReplaceAll );

(所以有一个内置在毕竟AnsiString类型替换功能)

编辑:添加代码标记,所以我们可以不同引号之间区分

其他提示

我没有用AnsiString,但基本上我就会做到以下几点:

  • 反找到单一的报价在你的字符串
  • 看到左边和右边的当前单一的报价指数
  • 如果没有一个单一的报价已经在那里,插入一个单一的报价后你目前的指数
  • 继续循环直到你打index0.

通常的方式做到这一点是使用,而不是生成自己的SQL准备语句。查找 SQL注入的原因之一,这是不好的。基本上,如果你的应用程序的任何地方,你忘了在任何SQL语句来翻倍的行情,并且攻击者能够以某种方式提交值成sql语句,你的数据库被黑客攻击。 (请参见此XKCD漫画获取的会发生什么一个幽默的例子。)

在C ++ Builder中,你要寻找的AnsiQuotedStr功能,SysUtils。它的倒数是AnsiExtractQuotedStr。他们不是AnsiString类型本身的方法,因为他们并不需要的那种类型的内部成竹在胸。

更重要的是,你应该使用的参数化查询的。如果您使用的数据库访问组件不支持那些,然后得到一个不同的数据库库。没有数据库的选择不足,所以你可以买得起挑剔的功能和参数查询应靠近列表的顶部。

请注意,尽管它们的名称中,AnsiX函数接受UnicodeString参数,而不是AnsiString,在Delphi和C ++ Builder 2009。

会发生什么事,如果你用它替换像

item = StringReplace( item, "'", "\'", TReplaceFlags() );
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top