2016-06-27 3 views
1

Обычно 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

ответ

1

Это СУБД (система управления реляционными базами данных), которая экранирует апострофа, а не .NET. Я предполагаю, что execute immediate использует буквенную строку, потому что она предназначена для сборки динамического SQL.

+0

Я предполагаю, что вы имеете в виду специальные драйверы asp? если бы я делал то же самое в coldfusion, я мог бы использовать функцию preserveSingleQuotes, заставляя CF передавать одиночную кавычку, так что она обрабатывается до того, как RDBMS получит ее. – Travis

+0

Ну, очевидно, что в вашем примере .NET не заполняет параметр экранированным апострофом. ADO.NET не знает, что такое содержимое пакета. Я не знаком с CF, но ORM, такие как Entity Framework, действительно прочитают пакет и попытаются его интерпретировать (это не очень хорошо). Возможно, CF делает что-то подобное. –

+0

Я не знаю, как работают драйверы или как их используют разные технологии, поэтому я не буду притворяться. То, что ты говоришь, делает мне сеанс. Oracle говорит: «Эта переменная находится в блоке« выполнить немедленный », лучше не вмешиваться». Я бы хотел подумать, что Oracle такой умный ... но это глупо во многих отношениях, я думаю, что это должно быть умнее. LoL – Travis

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