Привязка параметров: Что происходит под капотом?

Несколько лет спустя в настоящее время официально существует лучшее решение. DOM4 Mutation Observers заменяют устаревшие события мутации DOM3. Они , которые в настоящее время реализованы в современных браузерах как MutationObserver (или как префикс поставщика WebKitMutationObserver в старых версиях Chrome):

MutationObserver = window.MutationObserver || window.WebKitMutationObserver;

var observer = new MutationObserver(function(mutations, observer) {
    // fired when a mutation occurs
    console.log(mutations, observer);
    // ...
});

// define what element should be observed by the observer
// and what types of mutations trigger the callback
observer.observe(document, {
  subtree: true,
  attributes: true
  //...
});

В этом примере прослушивается DOM изменения на document и все его поддерево, и оно будет срабатывать при изменении атрибутов элемента, а также структурных изменений. Спецификация проекта имеет полный список действительных свойств для прослушивания мутаций :

childList

  • Установите значение true, если мутации для целей дети должны быть обнаружены.

attributes

  • Установите на true, если необходимо соблюдать мутации для атрибутов цели.

characterData

  • Установите на true, если необходимо наблюдать мутации данных цели.

поддерево

  • Установите, чтобы true, если мутации не просто нацелены, но также должны наблюдаться потомки цели.

attributeOldValue

  • Установите значение true если attributes установлено значение true и значение атрибута цели до того, как необходимо записать мутацию.

characterDataOldValue

  • Установите значение true, если characterData установлено значение true и данные цели до того, как необходимо записать мутацию.

attributeFilter

  • Установить список локальных имен атрибутов (без пространства имен) если не все атрибутные мутации
blockquote>

(Этот список действует с апреля 2014 года; вы можете проверить спецификацию на любые изменения.)

7
задан rob mayoff 28 June 2013 в 21:52
поделиться

3 ответа

Страница руководства MySQL на подготовленных операторах предоставляет большую информацию (который должен относиться к любому другому RDBMS).

В основном Ваш оператор анализируется и обрабатывается заранее, и параметры отправляются отдельно вместо того, чтобы быть обработанными наряду с кодом SQL. Это устраняет АТАКИ С ИСПОЛЬЗОВАНИЕМ КОДА НА SQL, потому что SQL анализируется, прежде чем параметры даже устанавливаются.

5
ответ дан 7 December 2019 в 12:27
поделиться

в терминах неспециалиста: если подготовленный оператор будет отправлен затем, то DB будет использовать план, если это будет доступно, он не должен не воссоздавать план каждый раз, когда этот запрос отправляется, но только значения параметрических усилителей изменились. это очень похоже на то, как procs работают, дополнительная выгода с procs - то, что можно дать разрешение через procs только а не к базовым таблицам вообще

0
ответ дан 7 December 2019 в 12:27
поделиться

Если Вы используете MS SQL, загружаете профилировщика, и Вы будете видеть, какие SQL-операторы сгенерированы при использовании параметризированных запросов. Вот пример (я использую Предприятие Libary 3.1, но результатами является то же использование SqlParameters непосредственно) против SQL Server 2005:

string sql = "SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did";
Database db = DatabaseFactory.CreateDatabase();
using(DbCommand cmd = db.GetSqlStringCommand(sql))
{
  db.AddInParameter(cmd, "DomName", DbType.String, "xxxxx.net");
  db.AddInParameter(cmd, "Did", DbType.Int32, 500204);

  DataSet ds = db.ExecuteDataSet(cmd);
}

Это генерирует:

exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did',
  N'@DomName nvarchar(9),
  @Did int',
  @DomName=N'xxxxx.net',
  @Did=500204

Можно также видеть здесь, если символы цитаты были переданы как параметры, их оставляют соответственно:

db.AddInParameter(cmd, "DomName", DbType.String, "'xxxxx.net");

exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did',
  N'@DomName nvarchar(10),
  @Did int',
  @DomName=N'''xxxxx.net',
  @Did=500204
0
ответ дан 7 December 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: