Исключение .NET с SQL Server 2008 - PullRequest
1 голос
/ 20 декабря 2011

Этот код запускает ASP.NET на IIS.7 в Windows Server 2008 R2 и SQL Server 2008 R2 Express.

Это простая функция, которая выбирает из базы данных на основе 3 параметров и возвращает объект, содержащий выбранную строку.

В большинстве случаев этот код выполняется нормально, но в некоторых случаях я получаю исключение под названием serial_number, которое является именем столбца в таблице базы данных.

Это полное исключение:

[IndexOutOfRangeException: серийный_номер]
System.Data.ProviderBase.FieldNameLookup.GetOrdinal (String fieldName) + 2674398
System.Data.SqlClient.SqlDataReader.GetOrdinal (имя строки) + 249
System.Data.SqlClient.SqlDataReader.get_Item (имя строки) + 23
PhoneSerialNumber.GetByPhoneNumber (String phoneNumber, String Country, String app) + 423
UpdateMeClass.GenereteVersionTag (строковая версия, строковый номер телефона, строковое имя приложения) + 534
UpdateMe.ProcessRequest (контекст HttpContext) в каталоге c: \ inetpub \ wwwroot \ me \ Handlers \ UpdateMe.ashx: 63
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () + 599
System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логическое и завершено синхронно) + 171

Хотя я зарегистрировал 3 параметра в случае исключения, и они не равны нулю, учтите, что когда я имитирую один и тот же запрос с теми же параметрами на одном и том же сервере, он работает нормально.

Я думаю, что в случае исключения запрос выполняется нормально, но при получении значений столбцов через это исключение я могу ошибаться.

SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["meConnectionString"].ConnectionString);

connection.Open();
SqlCommand cmd;
using (connection)
{
    cmd = new SqlCommand("select * from serialnumber_table join countries on  country_id=countryid join applications on ApplicationID=App_ID where phone_number= @phoneNumber and  country_name=@Country and app_name=@app", connection);
    cmd.Parameters.AddWithValue("@phoneNumber", phoneNumber);
    cmd.Parameters.AddWithValue("@Country", Country);
    cmd.Parameters.AddWithValue("@app", app);

    using (SqlDataReader rdr = cmd.ExecuteReader())
    {
       while (rdr.Read())
       {
          sn = new PhoneSerialNumber();
          sn.SerialNumber = rdr["serial_number"].ToString();
          sn.PhoneNumber = rdr["phone_Number"].ToString();
          sn.PhoneLang = rdr["Lang"].ToString();
          sn.PhoneModel = rdr["ModelName"].ToString();
          sn.ApplicationVersion = rdr["App_Version"].ToString();
          sn.DealerCode = rdr["dealer_code"].ToString();
          sn.Size = rdr["size"].ToString();

          TimeSpan Time = DateTime.Parse(rdr["Renewal_Date"].ToString()) - new DateTime(1970, 1, 1, 0, 0, 0);
          sn._renewal_Date = (long)(Time.TotalMilliseconds);

          rdr.Dispose();
          connection.Dispose();
          return sn;
       }
   }

   sn = new PhoneSerialNumber();
   sn.SerialNumber = null;
   sn.PhoneNumber = null;
   sn.PhoneModel = null;
   sn.PhoneLang = null;
   sn.ApplicationVersion = null;
   sn.DealerCode = null;
   connection.Dispose();
   return sn;
}

Ответы [ 5 ]

3 голосов
/ 20 декабря 2011

Единственное, что приходит на ум, это то, что по какой-то причине при выполнении запроса столбец serial_number не возвращается.Вместо того, чтобы SELECT *, попробуйте выполнить выборку для каждого отдельного столбца, который вы пытаетесь вернуть.

Дублирован ли столбец с серийным номером в любой из других таблиц?Есть какие-то источники просмотров ?!Если serial_number исходит из вида, и вы изменили базовую таблицу, его, возможно, потребуется перестроить, чтобы отобразить соответствующие столбцы для представления.

единственный раз, когда я видел исключение в качестве имени столбца, это когда указанный столбец не существует в текущем считывателе данных, как если бы он не был выбран изначально или просто не был выбранесть

1 голос
/ 20 декабря 2011

Это только предположение, но также возможно, что вы дважды используете rdr.Один раз с оператором using, который преобразуется в блок try / finally, и один раз явно перед оператором return с вашим PhoneSerialNumber..NET генерирует исключения, когда вы утилизируете то, что уже утилизирует.Поскольку никаких исключений не было опубликовано, я просто догадываюсь здесь.

0 голосов
/ 20 декабря 2011

TimeSpan Time "Время - это КЛЮЧЕВОЕ СЛОВО, используйте более значимые имена переменных и используете ли вы все поля из запроса Выбрать ..? Если нет, то выберите *

0 голосов
/ 20 декабря 2011

Вероятность того, что serial_number содержит ноль, возвращается как DBNull.Value. Попробуйте использовать rdr ["serial_number"] в качестве строки вместо rdr ["serial_number"]. ToString ().

Кроме того, избегайте использования SELECT *. Он возвращает больше данных, чем необходимо, что увеличивает сетевой трафик, а именованные столбцы в вашем SELECT выдают лучшие сообщения об ошибках.

0 голосов
/ 20 декабря 2011

Учитывая, что вы указали только "serial_number" в качестве причины исключения (это не может быть само исключение), я считаю, что строка виновника такова:

sn.SerialNumber = rdr["serial_number"].ToString(); 

Скорее всего, это значение равно нулю.

Если проблема в том, что столбец на самом деле не существует, я бы спросил, генерируется ли эта таблица динамически, и кто-то не выполняет свою работу правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...