Прежде чем вы отметите этот вопрос как дубликат, вот сложная часть, которую я не понимаю. Эта ошибка является спорадической, я считаю, что код правильный, и он всегда работает, и я обрабатываю возможные ошибки с условием if else внутри части Reader. Вот код:Код не синхронизированный метательный индекс был вне границ массива?
public static Tuple<int, string> GetIDAndString(string term)
{
try
{
using (SqlConnection con = GetConnection())
using (cmd = new SqlCommand())
using (myReader)
{
int ID = 0;
string status = string.Empty;
cmd.Connection = con;
con.Open();
cmd.CommandText = @"SELECT t.TableID, t.Status
FROM Table t WITH (NOLOCK) /* I know NOLOCK is not causing the mistake as far as I know */
WHERE t.Term = @term";
cmd.Parameters.AddWithValue("@term", term);
myReader = cmd.ExecuteReader();
while(myReader.Read())
{
ID = myReader.IsDBNull(0) ? 0 : myReader.GetInt32(0);
status = myReader.IsDBNull(1) ? string.Empty : myReader.GetString(1).Trim();
}
myReader.Close();
return new Tuple<int, string>(ID, status);
}
}
catch (Exception)
{
throw;
}
}
Я знаю, что я должен использовать класс вместо кортежей, но я не могу изменить, что существующий код и как вы можете видеть. Поэтому основная проблема заключается в том, что на рабочем сервере в этом методе был Index out of bounds array exception
, но я не могу определить, в чем проблема.
Даже если этот термин не найден в запросе, myReader не войдет, и я верну ID = 0, status = string.Empty. Иногда, когда я отлаживаю код и работаю над develpment server
, мой код начинает крушить всюду, показывая мне исключения, где протестирован код, и я должен снова открыть решение, чтобы избежать этого (я не нашел решения для этого, даже не очистка раствора).
Поэтому я надеюсь, что у кого-то есть опыт с чем-то подобным в production server
. У меня нет спецификаций для производственного сервера, поэтому я ничего не знаю о сервере.
Создать новый считыватель данных, не разделяя его! Это может вызвать проблемы! – mybirthname
Согласитесь с предыдущим комментарием, либо создайте новый экземпляр, либо синхронизируйте с ним доступ. –
@mybirthname, я новичок в программировании, вы сказали, что не разделяете dataReader. Вы имеете в виду не использовать класс, в котором я объявлял защищенный статический SqlDataReader, а затем использовал его в блоке использования? –