我想你可以猜到我遇到的问题。我将文件名插入到C ++ Builder中的sql数据库中。有些文件名称中包含撇号。这打破了sql插入查询。解决这个问题的常用方法是加倍和撇号,你想成为字段值的一部分。
例如,如果我想将'george'添加到字段'owner',则sql查询将“插入表(所有者)值('george'')”
我很满意。我只需要将单个撇号替换为双撇号。 AnsiString似乎没有内置函数。有没有一个简单的方法可以做到这一点而不必包含一个全新的头文件?
答案 0 :(得分:6)
其实我自己得到了答案......
item = StringReplace( item, "'", "''", TReplaceFlags() <<rfReplaceAll );
(所以在AnsiString中有一个内置的替换函数)
编辑:添加了代码代码,以便我们区分不同的引号
答案 1 :(得分:1)
我没有使用AnsiString,但基本上我会做以下事情:
答案 2 :(得分:0)
通常的方法是使用预准备语句而不是生成自己的sql。查看SQL Injection,原因就是这个错误。基本上,如果您的应用程序中的任何位置,您忘记在任何sql语句中加倍引号,并且攻击者可以某种方式向该sql语句提交值,您的数据库被黑客入侵。 (有关可能发生的事情的详细示例,请参阅this xkcd comic。)
答案 3 :(得分:0)
在C ++ Builder中,您正在AnsiQuotedStr
中查找SysUtils
函数。它的倒数是AnsiExtractQuotedStr
。它们不是AnsiString
类型本身的方法,因为它们不需要对类型内部的深入了解。
更重要的是,您应该使用参数化查询。如果您用于数据库访问的组件不支持这些组件,则获取不同的数据库库。数据库选择并不缺乏,因此您可以对功能保持挑剔,参数化查询应该位于列表的顶部。
请注意,尽管名称不同,但在Delphi和C ++ Builder 2009中AnsiX
函数接受UnicodeString
参数,而不是AnsiString
。
答案 4 :(得分:0)
如果你那样替换
会发生什么item = StringReplace( item, "'", "\'", TReplaceFlags() );