У меня возникли проблемы с пониманием объема замены. Ваша оригинальная линия:
SQL=SQL.Replace("''","'");
Поскольку вы применяете его к имени переменной SQL, я предполагаю, что вы заменяете все вхождения '' на 'во всем операторе.
Это не может быть правильно: рассмотрите это утверждение:
SELECT * FROM tab WHERE col = '<input value goes here>'
Теперь, если пустая строка, оператор будет:
SELECT * FROM tab WHERE col = ''
... и после SQL.Replace ("''", "'") оно станет:
SELECT * FROM tab WHERE col = '
Как видите, он оставит висящую одинарную кавычку и приведет к синтаксической ошибке.
Теперь давайте предположим, что вы намеревались написать SQL.Replace ("'", "' '"), тогда заменяемое выражение станет:
SELECT * FROM tab WHERE col = ''''
Хотя синтаксически правильно, вы теперь сравниваете col с буквальной одинарной кавычкой (так как '' внутри внешних одинарных кавычек, которые разделяют буквальную строку, будет вычисляться как буквальная одинарная кавычка). Так что это тоже не может быть правдой.
Это наводит меня на мысль, что вы можете делать что-то вроде этого:
SQL = "SELECT * FROM tab WHERE col = '" & ParamValue.Replace("'", "''") & "'"
Теперь, как уже указывалось на предыдущем постере, этот подход не работает для числа. Или, на самом деле, этот подход применим только в том случае, если вы хотите обработать ввод внутри строкового литерала в зачете SQL.
Есть, по крайней мере, случай, когда это может быть проблематично. Если параметр QUOTED_IDENTIFIER серверов MS SQL отключен, литеральные строки также могут быть заключены в двойные кавычки. В этом случае пользовательские значения, вводящие двойные кавычки, приведут к тем же проблемам, что и у вас с одинарными строками. Кроме того, стандартная escape-последовательность для одной кавычки (две одинарные кавычки) больше не работает !!
Просто рассмотрите этот фрагмент:
SET QUOTED_IDENTIFIER OFF
SELECT " "" '' "
Это дает результат:
" ''
Так что, по крайней мере, процесс экранирования должен отличаться в зависимости от того, разделяете ли вы строки одинарными или двойными кавычками. Это может не показаться большой проблемой, так как QUOTED_IDENTIFIER включен по умолчанию, но все же. См:
http://msdn.microsoft.com/en-us/library/ms174393.aspx