SqlDataReader отбрасывает столбцы случайным образом! - PullRequest
2 голосов
/ 16 января 2011

У меня очень странная проблема, я использую System.Data.SqlClient. получить данные с SQL Server через хранимую процедуру. Когда я тестирую приложение на машинах разработки и размещения, оно работает нормально, но при развертывании приложения на производственном сервере I случайным образом , получая SqlDataReader IndexOutOfRangeException с разными именами столбцов !.

Ошибка появляется в 2 запросах в каждом запросе 1000 (приблизительно).

Кластер SQL Server

Исходный код:

public static List<CountryInfo> GetAllCountries(){
            List<CountryInfo> Items = new List<CountryInfo>();
            try{
                using (rdr = SqlHelper.ExecuteReader(Globals.ConnectionString, "unv_spGetAllCountries"))
                {
                    while (rdr.Read())
                    {
                        CountryInfo item = new CountryInfo();
                        item.CountryId = Convert.ToInt32(rdr["CountryId"]);
                        item.CountryName = rdr["CountryName"].ToString();
                        item.FirstLevel = rdr["FirstLevel"].ToString();
                        item.SecondLevel = rdr["SecondLevel"].ToString();

                        Items.Add(item);

                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            Items.TrimExcess();
            return Items;
        }

Хранимая процедура:

select * from unv_tblCountries order by CountryName;

Уже протестировано

  • Проверить имена столбцов хранимой процедуры.
  • Проверьте имена столбцов Reader.
  • Проверьте строку подключения.

Кто-нибудь сталкивался с такой проблемой и решил ее?

Ответы [ 2 ]

3 голосов
/ 16 января 2011

Держу пари, это не проблема чтения данных.Я предполагаю, что одна или несколько учетных записей пользователей используют более конкретную (и более старую) копию sproc (и т. Д.) - например, Fred.MyProc вместо dbo.MyProc, или в sproc есть логика условного ветвления, которая возвращаетв некоторых случаях разные столбцы - возможно, ветвь кода, которую вы забыли обновить.

Другая потенциальная проблема, возможно, заключается в различной чувствительности к регистру в БД, вызывающей использование различных объектов;т.е. Myproc vs MyProc - который может отличаться, если в БД учитывается регистр.

Чтобы убедиться в этом, прикрепите трассировку SQL к журналу точно что (и кем) отправляетсяза невыполненные дела;затем повтори это в чем-то вроде SSMS, сравнивая dev с prod.

1 голос
/ 17 января 2011

Я обнаружил, что SqlDataReader varibale rdr был объявлен как static в контроллерах базовый класс , который сделал его общей переменной между всеми контроллерами.Потоки запросов использовали тот же DataReader и меняли в нем столбцы.

...