Обычно ASP.Net (я думаю, что это .NET делает это) будет делать магию с одинарными кавычками при вызове процедуры. Например, следующее будет работать нормально ...asp.net и Oracle single escape auto escape
dim aThing as string = "you're not as cool as your dog"
...
cmd.CommandText = "pkg_cool.s_you"
cmd.Parameters.Add(New OracleParameter("iSomeVar", OracleDbType.Varchar2)).Value = aThing
cmd.executeNonQuery()
Пакет имеет простой запрос на обновление
insert into someTable (colName)values(iSomeVar)
Теперь, если я делаю то же самое в ASP, но изменить пакет использовать execute immediate
в одинарные кавычки нужно избегать; Я сделал это в asp replace(aThing,"'","''")
. Может кто-нибудь объяснить, почему?
-- the following will work fine if the asp variable "aThing" does not contain an apostrophe.
execute immediate
'insert into ' || vTableName || '(' || colName || ')values(''' || iSomeVar || ''')';
SQL Error: ORA-00917: missing comma
Я предполагаю, что вы имеете в виду специальные драйверы asp? если бы я делал то же самое в coldfusion, я мог бы использовать функцию preserveSingleQuotes, заставляя CF передавать одиночную кавычку, так что она обрабатывается до того, как RDBMS получит ее. – Travis
Ну, очевидно, что в вашем примере .NET не заполняет параметр экранированным апострофом. ADO.NET не знает, что такое содержимое пакета. Я не знаком с CF, но ORM, такие как Entity Framework, действительно прочитают пакет и попытаются его интерпретировать (это не очень хорошо). Возможно, CF делает что-то подобное. –
Я не знаю, как работают драйверы или как их используют разные технологии, поэтому я не буду притворяться. То, что ты говоришь, делает мне сеанс. Oracle говорит: «Эта переменная находится в блоке« выполнить немедленный », лучше не вмешиваться». Я бы хотел подумать, что Oracle такой умный ... но это глупо во многих отношениях, я думаю, что это должно быть умнее. LoL – Travis