Соответствие точной строки в функции SQL.Replace - PullRequest
0 голосов
/ 29 мая 2019

У меня есть цикл 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 + '''))

1 Ответ

0 голосов
/ 29 мая 2019

Проблема решена благодаря @Charles May:

SQLQP = SQLQP.Replace(",", " , ")
SQLQP = SQLQP.Replace(")", " )")
SQLQP = SQLQP.Replace("(", "( ")

For i = CT.Count - 1 To 0 Step -1
    SQL = SQL.Replace(CT.Item(i).ParameterName, "'" & CT.Item(i).Value & "'")
    SQLQP = SQLQP.Replace(" " + CT.Item(i).ParameterName + " ", "''' + " & 
CT.Item(i).ParameterName & " + '''")
     End If
  Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...