2016-04-05 12 views
0

У меня проблема, когда я хочу заменить некоторые отдельные одинарные кавычки двойными кавычками внутри строки SQL, но не все одиночные кавычки в этой строке.Поиск конкретной отдельной цитаты и замена двойными кавычками в C#

EXEC procedureName 'param'eter1', 'parameter2' 

В приведенном выше примере, я просто хочу, чтобы заменить одиночную кавычку внутри «param'eter1», но одиночные кавычек в начале и в конце параметра остается одинаковыми.

Используя команду ниже, замените все одиночные кавычки в строке, и это выглядит как «param''eter1», что неверно.

sometext.Replace("'", "''") 

Я хочу, чтобы выглядеть следующим образом:

EXEC procedureName 'param''eter1', 'parameter2' 

Также обрати внимание, что я уже знаю, что использование SqlParameter является лучшим решением для обработки одинарных кавычек в параметрах SQL, но из-за ограничения, в среде проекта я не могу это реализовать.

Update:

Изменение отдельных параметров, прежде чем использовать их, чтобы построить полный текст заявления не вариант для меня, как у меня нет доступа к этому коду. Мой проект работает как слой данных, где он получает строки SQL из других приложений для обработки.

+1

Вы можете использовать регулярное выражение, которое соответствует '' 'не после пробела, а не перед пробелом/запятой. Но вам действительно нужно изменить архитектуру вашего проекта (или, по крайней мере, назвать имя службы, чтобы люди здесь не стали жертвами SqlInjection ...) – gdoron

+0

Внесите изменения в отдельные параметры, прежде чем использовать их для постройте полное утверждение. – NineBerry

ответ

0

Это очень плохая идея. Синтаксис SQL требует, чтобы вы избегали одиночных кавычек в литералах именно потому, что в противном случае он не может определить, предназначена ли одна кавычка для представления одной кавычки или предназначена для завершения строкового литерала.

Рассмотрим следующий пример:

EXEC procedureName 'param ', ' eter1', 'parameter2' 

Как вы знаете, это означает ли иметь три параметра для вызова процедуры или только два? И даже если вы знали, что эта конкретная процедура принимает два параметра, вы не можете решить, относится ли средняя часть к первому или второму параметру.

Если система строит sql-инструкции из пользовательского ввода, не имея дело с одинарными кавычками до того, как будет создана полная инструкция, это может быть очень легко использовано для атаки системы через sql injection.

+0

Да, вы правы, то, чего я пытаюсь достичь, не будет работать всегда, а также подвержено атакам с использованием sql-инъекций, поэтому я могу отказаться от этой идеи. – Dineesh

-1

вы можете сделать, как этот

var aStringBuilder = new StringBuilder(theString); 
aStringBuilder.Remove(3, 2); // just find a position of single quotes 
aStringBuilder.Insert(3, "/""); // replace that position with " quotes using loop 
theString = aStringBuilder.ToString(); 
+0

Это не сработает для меня, поскольку положение одиночных кавычек неизвестно, оно может быть где угодно. – Dineesh

Смежные вопросы