У меня есть цикл for, который ищет запрос SQL и заменяет 'CT.Item (i) .ParameterName' его фактическим значением:
Dim SQLQP As String = SQL
For i=0 To CT.Count - 1
SQL = SQL.Replace("CT.Item(i).ParameterName, "'" & CT.Item(i).Value & "'")
SQLQP = SQLQP.Replace(CT.Item(i).ParameterName, "''' + " & CT.Item(i).ParameterName & " + '''")'.Replace("'%'", "''%''")
End If
Next
«CT.Item (i) .ParameterName» - это имена параметров (например: @ p1, @ p2, @ p3 и т. Д.)
Проблема в том, что если есть имя параметра, называемое @ p10, вышеприведенный цикл воспринимает его как "@ p1" + "0", поэтому, когда он собирается изменить @ p1, он также меняет @ p10 и оставляет 0 висящим вокруг. Как я могу избежать этой проблемы?
Другие решения, которые я нашел при поиске, либо не учитывают пунктуацию, либо используют REGEX, что неприменимо внутри функции SQL.replace.
Спасибо за вашу помощь
РЕДАКТИРОВАТЬ: я решил проблему с «SQL», изменив цикл. Тем не менее, теперь я получаю ту же проблему с «SQLQP»:
Оператор else
Else
SQLQP = SQLQP.Replace(CT.Item(i).ParameterName, "''' + " & CT.Item(i).ParameterName & " + '''")
возвращается:
[some sql code]... WHERE ([RM_INSTRUCTION].[INSTRUCTION_TIME] >= ''' + @p1 + ''') AND ([RM_INSTRUCTION].[ITEM_CATEGORY_UID] IN (''' + @p2 + ''',''' + @p3 + ''',''' + @p4 + ''',''' + @p5 + ''',''' + @p6 + ''',''' + @p7 + ''')) AND ([RM_INSTRUCTION].[ITEM_DETAIL_UID] IN (''' + @p8 + ''',''' + @p9 + ''',''' + ''' + @p1 + '''0 + '''))')
'' '+' '' + @ p1 + '' '0 +' '' неверно, должно быть '' '+ @ p10 +' '', все остальное правильно.
РЕДАКТИРОВАТЬ 2
По запросу, здесь SQLQP перед заменой
.
[some sql]...WHERE ([RM_INSTRUCTION].[INSTRUCTION_TIME] >= @p1) AND ([RM_INSTRUCTION].[ITEM_CATEGORY_UID] IN (@p2,@p3,@p4)) AND ([RM_INSTRUCTION].[ITEM_TYPE_UID] IN (@p5)) AND ([RM_INSTRUCTION].[ITEM_DETAIL_UID] IN (@p6,@p7,@p8,@p9,@p10))
А вот как это должно выглядеть:
[some sql]...WHERE ([RM_INSTRUCTION].[INSTRUCTION_TIME] >= ''' + @p1 + ''') AND ([RM_INSTRUCTION].[ITEM_CATEGORY_UID] IN (''' + @p2 + ''',''' + @p3 + ''',''' + @p4 + ''')) AND ([RM_INSTRUCTION].[ITEM_TYPE_UID] IN (''' + @p5 + ''')) AND ([RM_INSTRUCTION].[ITEM_DETAIL_UID] IN (''' + @p6 + ''',''' + @p7 + ''',''' + @p8 + ''',''' + @p9 + ''',''' + @p10 + '''))