Почему только некоторые пользователи получают сообщение об ошибке: «Соединение занято результатами для другой команды» - PullRequest
8 голосов
/ 26 января 2012

У меня есть приложение Delphi, которое подключено к базе данных SQL Server с использованием компонента SDAC от DevArt, у нас есть 200 установок программного обеспечения и только для клиента, с некоторыми пользователями, я замечаю следующую ошибку:

"Connection is busy with results for another command" = "La connessione è occupata dai risultati di un altro comando".

Версия SQL. : SQL Server 2008 R2 Express с включенным полным потоком файлов

Мое приложение создает и пользователей базы данных, и учетные записи SQL:

  1. создание нового пользователя, тогда нет проблем
  2. изменение кода пользователя в моем приложении, это означает, что создан другой пользователь базы данных и логин SQL, у меня ошибка
  3. эта проблема возникает только у некоторых пользователей, а не у всех

То, что я уже попробовал без удачи:

  1. удаленная и переустановленная база данных
  2. удаленный и переустановленный экземпляр SQL Server
  3. проверенные пользователи / свойства учетной записи в SQL Server (все в порядке)

Если вам нужна конкретная информация, пожалуйста, скажите мне

------------ НОВАЯ ИНФОРМАЦИЯ ------------

Я лучше проверил все свойства экземпляра из Studio Management и заметил, что ЦП не проверяются (см. Изображение ниже). CPU's flags not checked

Вместо этого во всех других обычных установках SQL Server я вижу заполненные флажки. Может ли это быть проблемой?

Надеюсь, это поможет вам помочь мне ...

Ответы [ 5 ]

5 голосов
/ 27 января 2012

Ошибка «Соединение занято результатами для другой команды» означает, что существует как минимум два запроса, которые используют одно и то же соединение.Эта проблема может возникнуть, если вы используете одно соединение в нескольких потоках.Для решения проблемы в этом случае у вас должно быть соединение (компонент TMSConnection) в каждом потоке.Также эта проблема может возникнуть, если для свойства TCustomMSDataSet.FetchAll задано значение False.Когда FetchAll = False, выполнение таких запросов блокирует текущий сеанс.Чтобы избежать блокировки, OLEDB создает дополнительный сеанс, который может вызвать ошибку «Соединение занято с результатами для другой команды».Чтобы решить проблему в этом случае, необходимо установить для свойства TMSConnection.Options.MultipleActiveResultSets значение True.Свойство MultipleActiveResultSets обеспечивает поддержку технологии множественных активных наборов результатов (MARS) SQL Server.Это позволяет приложениям иметь более одного ожидающего запроса на соединение и, в частности, иметь более одного активного набора результатов по умолчанию на соединение.Обратите внимание, что свойство MultipleActiveResultSets работает только при использовании собственного клиента SQL.Поэтому вам также следует установить для свойства TMSConnection.Options.Provider значение prNativeClient.

1 голос
/ 20 октября 2013

Просто хотел исправить ответ dataol и сказать, что для MARS_Connection должно быть установлено значение "Да" вместо "Истина", чтобы включить множественные активные наборы результатов. По крайней мере на SQL Server 2012, если вы используете файл DSN:

[ODBC]
DRIVER=SQL Server Native Client 11.0
DATABASE=MYDBNAME
WSID=
Trusted_Connection=Yes
SERVER=
MARS_Connection=Yes
0 голосов
/ 03 мая 2019

У меня была та же проблема, и я решил установить драйвер Microsoft odbc 11 (msodbcsql) (https://www.microsoft.com/pt-br/download/confirmation.aspx?id=36434).

0 голосов
/ 15 февраля 2018

@ ienax_ridens, недавно я столкнулся с той же проблемой, используя те же инструменты (Delphi и Devart-SDAC). В моем случае один конкретный запрос, дающий два набора результатов.В моем TMSQuery ниже упоминалось

If Condition= 1 
begin
 Select * from #TempTable1
end else 
begin
  -- Some more stuff
  Insert INTO #TempTable2
 --
 --
End
Select * from TempTable1 -- here is the problem

, поэтому в случае Condition = 1 он давал два набора результатов и вызывал «Соединение занято результатами для другой команды»

Надеюсь, это поможет вам.

Редактировать: я понял, что ваш пост довольно старый, пожалуйста, поделитесь тем, что вы сделали, чтобы устранить эту ошибку

0 голосов
/ 11 января 2013

Чтобы обеспечить поддержку множественного активного набора результатов (MARS) для соединения SQL с использованием драйвера MSSQL, необходимо добавить ключ с именем Mars_Connection и установить его значение на True.

...