当我重写总是相同的东西时,我习惯于写出我称之为字符串模式的东西。
假设我想进行SQL注入以扩展ORM功能......
protected static string FULLTEXTPATTERN = "EXISTS CONTAINSTABLE([{0}],*,'\"{1}\"') WHERE [key] = {0}.id;
通常我得到了表格名称和值,我将其组合在一个string.format(FULLTEXTPATTERN,...)中,一切都很好。
现在想象一下,我必须两次这样做。首先注入表名,然后是我搜索的值。所以我想写一些类似的东西:
protected static string FULLTEXTPATTERN = "EXISTS CONTAINSTABLE([{0}],*,'\"{{0}}/*Something that returns {0} after string.format*/\"') WHERE [key] = {0}.id;
...
var PartialPattern= string.fomat(FULLTEXTPATTERN, "TableX");
//PartialPattern = "EXISTS CONTAINSTABLE([TableX],*,'\"{0}\"') WHERE [key] = {0}.id"
...
//later in the code
...
var sqlStatement = string.format(PartialPattern,"Pitming");
//sqlStatement = "EXISTS CONTAINSTABLE([TableX],*,'\"Pitming\"') WHERE [key] = {0}.id"
有办法吗?
答案 0 :(得分:1)
逻辑说你只需将{{{0}}}
放在格式字符串中,以便在第二次{0}
调用后将其缩小到string.Format
,但你不能 - 抛出一个{ {1}}。但那是因为你还需要另一个FormatException
和{
,否则它的格式不正确:)。
您可以做什么 - 将完整格式设置为此(请注意最后的4个}
和{
个字符):
}
然后您的最终字符串将包含您期望的"EXISTS CONTAINSTABLE([{0}],*,'\"{{0}}\"') WHERE [key] = {{{{0}}}}.id";
。
作为证明 - 运行此测试:
{0}
答案 1 :(得分:0)
是否可以将生成SQL的时间延迟到您拥有所有必需输入的位置,以便您可以使用一次调用String.Format()和多个字段?
或者,您可以使用StringBuilder而不是String.Format()迭代地构建查询。