Этот код запускает 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;
}