Есть ли причина, по которой вам нужно использовать Context Connection?Используете ли вы какие-либо специфичные для сеанса функции, например, являетесь ли вы частью существующей транзакции, или читаете из существующих временных таблиц, или используете CONTEXT_INFO
/ SESSION_CONTEXT
?
Есть ли причина, по которой вы просто не 't использовать обычное / внешнее соединение?
(на эти вопросы ответили следующие цитаты)
Мы хотим, чтобы это работало с безопасностью пользователя, настройками соединения и т. д. Кроме того,, если я пытаюсь открыть соединение из кода, SQL Server вызывает исключение.Так что, честно говоря, я не особо задумывался.Открытие другого соединения было запрещено, и мы все равно хотели использовать контекстное соединение.Вот что мы сделали.
Работать с безопасностью пользователя достаточно просто:
- Если пользователь является логином на SQL Server, передайте этиучетные данные вместе в
ConnectionString
.Это может быть более трудным, если есть много пользователей, которые могут выполнять этот код, хотя вы могли бы передать пользователю свои учетные данные в качестве входных параметров для хранимой процедуры SQLCLR и построить из них строку подключения. Если пользователь является логином Windows, реализуйте олицетворение.Вы можете получить Windows Security Principal (или любой другой) от SqlContext
.Затем выполните:
using(impersonationContext = principal.Impersonate())
{
connection.Open();
...
impersonationContext.Undo();
}
Это не точно, но близко.
- Не уверен, почему вы получите исключение при открытии обычного соединения, если толькочто-то не так со строкой соединения.Было бы полезно получить точное (и полное) сообщение об ошибке, хотя звучит так, как будто вы уже прошли эту проблему.
Хорошо, так что мы на самом деле закончили с этим,Для этих запросов нам не требуется контекстное соединение.Таким образом, мы смогли избежать открытия новых соединений, вместо того чтобы выяснить, как эффективно переключать потоки.
Отлично!Рад слышать, что это все-таки сработало ?.Поскольку контекстное соединение не было обязательным , кажется, что потребовалось бы больше времени / усилий, чтобы выяснить переключение потоков, чем это стоило бы.И код хотел бы быть немного более сложным (то есть сложнее в обслуживании), чем то, что вы в итоге сделали.
Я подозреваю, что если бы мы с самого начала спроектировали это для выполнения этих запросовв главном потоке, что это не было бы такой проблемой.Но, похоже, это делает работу.
Правда, это могло бы быть проще, если бы вы спланировали эту часть с самого начала.Тем не менее, что бы ввел пункт-утверждение на этой особой связи, которая бы снизить производительность (даже если только незначительно).Даже несмотря на то, что Context Connection быстрее открывать / закрывать, чем обычное соединение, в зависимости от того, сколько времени потребуется для получения результатов из запросов, различные потоки могут потенциально ждать намного дольше, чем несколько лишних миллисекунд, потребляемых при установлении регулярногосоединения.Это, плюс повышенная сложность кода, вполне может стоить того, если вам требуются специфичные для сеанса функции (т. Е. Работа в активной транзакции, работа с локальными временными объектами, использование CONTEXT_INFO
и / или SESSION_CONTEXT
и т. Д.),но в противном случае, вероятно, нет.
Для получения дополнительной информации о работе с SQLCLR в целом, пожалуйста, посетите: SQLCLR Info