powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SqlCommand: "ad hoc" vs. "parameterized"
9 сообщений из 9, страница 1 из 1
SqlCommand: "ad hoc" vs. "parameterized"
    #39969444
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извините, что повторяю топик , но тут я описал вопрос более корректно да и тема касается .NET тоже :

Логика, которую я описал ниже, прекрасно работает на моих некритичных приложениях.
Но я не знаю, насколько она "кошерна", так как я не могу явно влиять на то, чтобы команда создания временной таблицы выполнялась как ad hoc.
А в документации на SqlCommand явно не описано, когда запрос будет выполнен как ad hoc а когда как параметризированный.
Если MS когда нибудь изменит поведение SqlCommand так, что запросы 1 и 2 будут упакованы в sp_executesql, то использование временных таблиц из .NET кода станет новозможным, а приложение станет неработоспособным.

Псевдокод для .NET и SQL Server
1) открываем коннекшн
2) создаём временную таблицу (только ad hoc командой!!!)
3) заливаем в неё кучу данных через SqlBulkCopy
4) выполняем запрос на выборку/изменение с джоином ко временной таблице (этот запрос уже может быть параметризированный)
5) закрываем коннекшн

Упрощённый пример:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
'1) открываем коннекшн
Using cn As New SqlConnection("Server=myServerAddress;Database=myDataBase;Trusted_Connection=True;")

	'2) создаём временную таблицу (только ad hoc командой!!!)
	Using cm As New SqlCommand("create table #T1(C1 int)", cn)
		cm.ExecuteNonQuery()
	End Using

    '3) заливаем в неё кучу данных через (обычно используя SqlBulkCopy)
	Using cm As New SqlCommand("insert #T1 select 1 C1 union all select 1", cn)
		cm.ExecuteNonQuery()
	End Using

	'4) выполняем запрос на выборку/изменение с джоином ко временной таблице (этот запрос уже может быть параметризированный)
	Using cm As New SqlCommand("select count(*) from #T1 where C1 = 1", cn)
		cm.Parameters.Add("X", SqlDbType.Int).Value = 1
		ret = CInt(cm.ExecuteScalar())
	End Using
End Using


Вопросы:
Можно ли включать такое использование времменных таблиц в приложение и быть уверенным, что со следующим фреймворком это ещё будет работать?
Может ли кто привести "тынц" в документацию на SqlCommand: "ad hoc" vs. "parameterized"?
...
Рейтинг: 0 / 0
SqlCommand: "ad hoc" vs. "parameterized"
    #39969464
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
SqlCommand: "ad hoc" vs. "parameterized"
    #39971562
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Alexander Us,

А почему Вы думаете, что это может перестать работать?
...
Рейтинг: 0 / 0
SqlCommand: "ad hoc" vs. "parameterized"
    #39971568
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Параметры придумали для лохов, которые не могут сами собрать sql-выражение из пользовательского ввода.
...
Рейтинг: 0 / 0
SqlCommand: "ad hoc" vs. "parameterized"
    #39971592
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us
Может ли кто привести "тынц" в документацию на SqlCommand: "ad hoc" vs. "parameterized"?


Параметризованные запросы кешируются, что сильно сказывается на скорости, и намного безопасней, убережёт от SQL инъекций.

Тынц в доку у меня в голове не записано. Мне также придётся искать, как и вам. Вы хоть пробовали? )
...
Рейтинг: 0 / 0
SqlCommand: "ad hoc" vs. "parameterized"
    #39971639
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Параметризованные запросы кешируются

Ad hoc в общем случае тоже вполне кэшируются (и это является ещё одной проблемой ad hoc - засорение кэша запросов). И даже могут использоваться повторно, если включена форсированная параметризация.
Но ТС спрашивал немного про другое - не про отличия ad hoc от parametrized, а про правила выполнения инструкций в первом или втором виде - т.е. можно ли считать комментарий в коде, поясняющий, что если параметров нет, то ad hoc, если есть - parametrized, за правило, которое будет соблюдаться в дальнейшем, т.к. если создание временной таблицы будет завернуто в вызов sp_executesql (в который заворачиваются все параметризованные инструкции), то эту временную таблицу никто никогда не увидит.
...
Рейтинг: 0 / 0
SqlCommand: "ad hoc" vs. "parameterized"
    #39971643
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Ad hoc в общем случае тоже вполне кэшируются (и это является ещё одной проблемой ad hoc - засорение кэша запросов). И даже могут использоваться повторно, если включена форсированная параметризация.


Это как бы, тоже не бесплатно, и требует ручного вмешательства в настройки )


Сон Веры Павловны
Но ТС спрашивал немного про другое - не про отличия ad hoc от parametrized, а про правила выполнения инструкций в первом или втором виде - т.е. можно ли считать комментарий в коде, поясняющий, что если параметров нет, то ad hoc, если есть - parametrized, за правило, которое будет соблюдаться в дальнейшем, т.к. если создание временной таблицы будет завернуто в вызов sp_executesql (в который заворачиваются все параметризованные инструкции), то эту временную таблицу никто никогда не увидит.


Да, теперь вопрос понял...

Автору вроде как переживать не из-за чего.
...
Рейтинг: 0 / 0
SqlCommand: "ad hoc" vs. "parameterized"
    #39971760
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
hVostt
Автору вроде как переживать не из-за чего.

А вдруг MS отменит запросы с параметрами или временные таблицы? Тогда все, суши весла
...
Рейтинг: 0 / 0
SqlCommand: "ad hoc" vs. "parameterized"
    #39971797
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2
hVostt
Автору вроде как переживать не из-за чего.

А вдруг MS отменит запросы с параметрами или временные таблицы? Тогда все, суши весла


Не думаю, что отменит, так как слишком много будет засушенных вёсел )
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / SqlCommand: "ad hoc" vs. "parameterized"
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]