У меня есть универсальный метод, который добавляет параметры в коллекцию cmd.parameters.Я получаю следующую ошибку, когда 2 человека одновременно выполняют одну и ту же хранимую процедуру:
SqlParameter уже содержится в другой SqlParameterCollection.
Я уже искал в StackOverflow, а также в других местах.в Интернете, но до сих пор я не могу исправить проблему.Мой код выглядит следующим образом:
protected DataSet ExecuteDataSet(string StoredProcName, List<TParameter> Params) {
bool internalOpen = false;
DataSet resultDataSet = null;
TDataAdapter dataAdapter;
TCommand cmd;
try {
resultDataSet = new DataSet();
dataAdapter = new TDataAdapter();
cmd = new TCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = StoredProcName;
if (transaction != null) {
cmd.Transaction = transaction;
cmd.Connection = transaction.Connection;
} else {
cmd.Connection = connection;
}
if (Params != null && Params.Count > 0) {
foreach (TParameter param in Params) {
cmd.Parameters.Add(param);
}
}
dataAdapter.SelectCommand = cmd;
if (connection.State == ConnectionState.Closed) {
connection.Open();
internalOpen = true;
}
dataAdapter.Fill(resultDataSet);
dataAdapter.SelectCommand.Parameters.Clear();
cmd.Parameters.Clear();
return resultDataSet;
} catch {
throw;
} finally {
if (internalOpen) {
connection.Close();
}
}
Ошибка происходит во время цикла foreach, но, несмотря на очистку параметров и применение некоторых других попыток исправления, я не смог предотвратить возникновение этой ошибки.
Это вызывается из другого метода, используя следующее:
result = base.ExecuteDataSet(procName,this.ConvertArrayList(this.ParamsList));
Это старое приложение на c # / asp.net (веб-формы), которое я использую, поэтому код отражает это.
Сообщение об ошибке начинается следующим образом:
[ArgumentException: SqlParameter уже содержится в другом SqlParameterCollection.] System.Data.SqlClient.SqlParameterCollection.Validate (индекс Int32, значение объекта) +5955779 System.Data.SqlClient.SqlParameterCollection.Add (значение объекта) + 34
Я тестирую с использованием двух браузеров, одновременно регистрирующихся как 2 пользователя, и нажимаю на ссылку на страницу, которая извлекает несколько записей.Один из этих пользователей получает ошибку, в то время как другой получает правильную страницу с возвращенными результатами, как и ожидалось.
Любая помощь будет принята с благодарностью.Извиняюсь, если я не объяснил это достаточно хорошо, но я смотрел на это весь день и не смог прогрессировать.
Заранее спасибо.
РЕДАКТИРОВАТЬ:
ParamsList устанавливается / получается так:
public ArrayList ParamsList {
get {
//Check to see if the parameters list has been initialised.
if (m_paramsList == null) {
//Create a new empty parameters list to pass back.
m_paramsList = new ArrayList();
}
return m_paramsList;
}
set {
m_paramsList = value;
}
}
И заполняется так:
internal void AddParameter(string name, string value) {
IDbDataParameter param = CreateStringParameter(name);
param.Value = GetValueFromString(value);
Dal.ParamsList.Add(param);
}
для каждого типа параметра типа ....
внутренняя пустота AddParameter (имя строки, двойное значение?) {
внутренняя пустота AddParameter (имя строки, значение байта []) {
и т. д.