The process was terminated due to an unhandled exception - C#

Узнай цену своей работы

Формулировка задачи:

Отваливается прога без ответа и привета... в журнале ощибок оставляет метку
Тип события:    Ошибка
Источник события:    .NET Runtime
Категория события:    Отсутствует
Код события:    1026
Дата:        18.12.2009
Время:        18:38:09
Пользователь:        Н/Д
Компьютер:    ***
Описание:
Application: PhoneBilling-server.exe
Framework Version: v4.0.21006
Description: The process was terminated due to an unhandled exception.
Exception Info: System.InvalidOperationException
Stack:
   at System.Data.Odbc.OdbcDataReader.GetValue(Int32)
   at System.Data.Odbc.OdbcDataReader.get_Item(Int32)
   at WindowsFormsApplication3.Form1.line_analystic(System.Object)
   at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Threading.ThreadHelper.ThreadStart(System.Object)
ругается я так понял на функцию line_analystic прога компилится под Visual Studio 2010 и NET 4.0 прога отваливается произвольно пробовал гонять данные имитируще процесс работы вроде все стабильно но в реальной ситуаци отлитает в течении дня .... Ругать не строго с шарпом и студей токо начал разбератся прогу эту написал изучая язык а точнее с первого по 7 днень общения основной период времени пытался приручить прогу к мускулу и разобратся чего оно отваливается по пункту 2 безуспешно... вот собственно функция
        public void line_analystic(object data) //Обработка строк
        {
            string ext, trk, call_date, call_time, duration, number, ext_name, ext_groupe, incoming_line;
            incoming_line = ""+data+"";
            Match row_m = Regex.Match(incoming_line, @" (?<ext>\d{3,3})\s+(?<trk>\d{3,3})\s+(?<call_date>\d{1,2}:\d{1,2})\s+(?<call_time>\d{1,2}:\d{1,2}:\d{1,2})\s+(?<duration>\d{1,2}:\d{1,2}:\d{1,2})\s+(?<number>[0-9x]+)");
            if (row_m.Success)
            {
                if (OdbcCon.State == ConnectionState.Closed)
                {
                    OdbcCon.Open();
                }
                ext = row_m.Groups["ext"].Value;                                        //внутрений
                trk = row_m.Groups["trk"].Value;                                        //горотская линия
                string trk_name;
                string[] temp = row_m.Groups["call_date"].Value.Split(':');
                call_date = temp[1] + "/" + temp[0] + "/" + DateTime.Now.Year;          //дата звонка
                call_time = row_m.Groups["call_time"].Value;                            //время звонка
                duration = row_m.Groups["duration"].Value;                              //продолжительность
                number = row_m.Groups["number"].Value.Trim('x');                        //номер набора
 
                    //Установка подключения К БД
                    //Было здесь подключение к БД
                    //Получение Абонента и группы из его внутренего номера
                    OdbcCom = new System.Data.Odbc.OdbcCommand("SELECT Owner,Groupes  FROM phones WHERE InPhone =  '" + ext + "'", OdbcCon);
                    OdbcDR = OdbcCom.ExecuteReader();
                    OdbcDR.Read();
                    ext_name   = "" + OdbcDR[0] + "";
                    ext_groupe = "" + OdbcDR[1] + "";
                    //Номер городской линии
                    OdbcCom = new System.Data.Odbc.OdbcCommand("SELECT nomera.Tel FROM nomera WHERE nomera.Line =  '" + trk + "'", OdbcCon);
                    OdbcDR = OdbcCom.ExecuteReader();
                    OdbcDR.Read();
                    trk_name = Convert.ToString(OdbcDR[0]);
 
                    //Получение инфорации о направлении звонка
                    String country_in_digit = number.Substring(0, 1); //Код выхода на межгород
                    String country_in_code = number.Substring(0, 3);  //Код города в Стране
                    if (country_in_digit != "0" || country_in_code == maskedTextBox7.Text)
                    {
                        //Получение названия Зоны и Тарифа
                        OdbcCom = new System.Data.Odbc.OdbcCommand("SELECT zones.Zone_Name, zones.Tarif_1_1 FROM zones WHERE zones.No_Zone ='1'", OdbcCon);
                        OdbcDR = OdbcCom.ExecuteReader();
                        OdbcDR.Read();
                        string zone_name  = Convert.ToString(OdbcDR[0]);
                        double zone_price = Convert.ToDouble(OdbcDR[1]);
                        double curr_rate  = Convert.ToDouble(maskedTextBox8.Text);
                        //Цена звонка
                        double call_price = callprice(duration, zone_price, curr_rate);
                        //Добавление данных в базу данных
                        OdbcCom = new System.Data.Odbc.OdbcCommand("INSERT INTO Statist VALUES (NULL,'" + datetime_encoding(call_date, call_time) + "', '" + ext_name + "', '" + duration + "','" + zone_name + "','" + zone_name + "','" + number + "','" + price_encoding(call_price) + "','" + ext_groupe + "','" + trk_name + "','" + ext + "') ", OdbcCon);
                        OdbcDR = OdbcCom.ExecuteReader();
                    }
                    String country_out_digit = number.Substring(0, 2); //Код выхода на международные звонки
                    if (country_in_digit == "0" && country_out_digit != "00")
                    {
                        //Страна
                        //Получение Названия города и зоны
                        OdbcCom = new System.Data.Odbc.OdbcCommand("SELECT sng.country, sng.No_Zone FROM sng WHERE sng.code = '" + number.Substring(0, 3) + "'", OdbcCon);
                        OdbcDR = OdbcCom.ExecuteReader();
                        OdbcDR.Read();
                        string city_name = Convert.ToString(OdbcDR[0]);
                        string city_zone = Convert.ToString(OdbcDR[1]);
                        //Получение названия Зоны и Тарифа
                        OdbcCom = new System.Data.Odbc.OdbcCommand("SELECT zones.Zone_Name, zones.Tarif_1_1 FROM zones WHERE zones.No_Zone ='" + city_zone + "'", OdbcCon);
                        OdbcDR = OdbcCom.ExecuteReader();
                        OdbcDR.Read();
                        string zone_name = Convert.ToString(OdbcDR[0]);
                        double zone_price = Convert.ToDouble(OdbcDR[1]);
                        double curr_rate = Convert.ToDouble(maskedTextBox8.Text);
                        //Цена звонка
                        double call_price = callprice(duration, zone_price, curr_rate);
                        //Добавление данных в базу данных
                        OdbcCom = new System.Data.Odbc.OdbcCommand("INSERT INTO Statist VALUES (NULL,'" + datetime_encoding(call_date, call_time) + "', '" + ext_name + "', '" + duration + "','" + zone_name + "','" + city_name + "','" + number + "','" + price_encoding(call_price) + "','" + ext_groupe + "','" + trk_name + "','" + ext + "') ", OdbcCon);
                        OdbcDR = OdbcCom.ExecuteReader();
                    }
                    if (country_out_digit == "00")
                    {
                        //Мир получение страны и зоны
                        OdbcCom = new System.Data.Odbc.OdbcCommand("SELECT inter.country, inter.No_Zone FROM inter WHERE inter.code = '" + number.Substring(2, 1) + "'", OdbcCon);
                        OdbcDR = OdbcCom.ExecuteReader();
                        OdbcDR.Read();
                        if (OdbcDR[0] == null)
                        {
                            OdbcCom = new System.Data.Odbc.OdbcCommand("SELECT inter.country, inter.No_Zone FROM inter WHERE inter.code = '" + number.Substring(2, 2) + "'", OdbcCon);
                            OdbcDR = OdbcCom.ExecuteReader();
                            OdbcDR.Read();
                            if (OdbcDR[0] == null)
                            {
                                OdbcCom = new System.Data.Odbc.OdbcCommand("SELECT inter.country, inter.No_Zone FROM inter WHERE inter.code = '" + number.Substring(2, 3) + "'", OdbcCon);
                                OdbcDR = OdbcCom.ExecuteReader();
                                OdbcDR.Read();
                                string country_name = Convert.ToString(OdbcDR[0]);
                                string country_zone = Convert.ToString(OdbcDR[1]);
                                //Получение названия Зоны и Тарифа
                                OdbcCom = new System.Data.Odbc.OdbcCommand("SELECT zones.Zone_Name, zones.Tarif_1_1 FROM zones WHERE zones.No_Zone ='" + country_zone + "'", OdbcCon);
                                OdbcDR = OdbcCom.ExecuteReader();
                                OdbcDR.Read();
                                string zone_name = Convert.ToString(OdbcDR[0]);
                                double zone_price = Convert.ToDouble(OdbcDR[1]);
                                double curr_rate = Convert.ToDouble(maskedTextBox8.Text);
                                //Цена звонка
                                double call_price = callprice(duration, zone_price, curr_rate);
 
                                //Добавление данных в базу данных
                                OdbcCom = new System.Data.Odbc.OdbcCommand("INSERT INTO Statist VALUES (NULL,'" + datetime_encoding(call_date, call_time) + "', '" + ext_name + "', '" + duration + "','" + zone_name + "','" + country_name + "','" + number + "','" + price_encoding(call_price) + "','" + ext_groupe + "','" + trk_name + "','" + ext + "') ", OdbcCon);
                                OdbcDR = OdbcCom.ExecuteReader();
                            }
                            else
                            {
                                string country_name = Convert.ToString(OdbcDR[0]);
                                string country_zone = Convert.ToString(OdbcDR[1]);
                                //Получение названия Зоны и Тарифа
                                OdbcCom = new System.Data.Odbc.OdbcCommand("SELECT zones.Zone_Name, zones.Tarif_1_1 FROM zones WHERE zones.No_Zone ='" + country_zone + "'", OdbcCon);
                                OdbcDR = OdbcCom.ExecuteReader();
                                OdbcDR.Read();
                                string zone_name = Convert.ToString(OdbcDR[0]);
                                double zone_price = Convert.ToDouble(OdbcDR[1]);
                                double curr_rate = Convert.ToDouble(maskedTextBox8.Text);
                                //Цена звонка
                                double call_price = callprice(duration, zone_price, curr_rate);
                                //Добавление данных в базу данных
                                OdbcCom = new System.Data.Odbc.OdbcCommand("INSERT INTO Statist VALUES (NULL,'" + datetime_encoding(call_date, call_time) + "', '" + ext_name + "', '" + duration + "','" + zone_name + "','" + country_name + "','" + number + "','" + price_encoding(call_price) + "','" + ext_groupe + "','" + trk_name + "','" + ext + "') ", OdbcCon);
                                OdbcDR = OdbcCom.ExecuteReader();
                            }
                        }
                        else
                        {
                            string country_name = Convert.ToString(OdbcDR[0]);
                            string country_zone = Convert.ToString(OdbcDR[1]);
                            //Получение названия Зоны и Тарифа
                            OdbcCom = new System.Data.Odbc.OdbcCommand("SELECT zones.Zone_Name, zones.Tarif_1_1 FROM zones WHERE zones.No_Zone ='" + country_zone + "'", OdbcCon);
                            OdbcDR = OdbcCom.ExecuteReader();
                            OdbcDR.Read();
                            string zone_name = Convert.ToString(OdbcDR[0]);
                            double zone_price = Convert.ToDouble(OdbcDR[1]);
                            double curr_rate = Convert.ToDouble(maskedTextBox8.Text);
                            //Цена звонка
                            double call_price = callprice(duration, zone_price, curr_rate);
                            //Добавление данных в базу данных
                            OdbcCom = new System.Data.Odbc.OdbcCommand("INSERT INTO Statist VALUES (NULL,'" + datetime_encoding(call_date, call_time) + "', '" + ext_name + "', '" + duration + "','" + zone_name + "','" + country_name + "','" + number + "','" + price_encoding(call_price) + "','" + ext_groupe + "','" + trk_name + "','" + ext + "') ", OdbcCon);
                            OdbcDR = OdbcCom.ExecuteReader();
                        }
 
                    }
                    //!Получение инфорации о направлении звонка
                    // Было OdbcCon.Close();            
                }          
        }
вызывается с двух мест (первый при обработке логов)
private void button6_Click(object sender, EventArgs e)    
        {
            string str;
            //Получение полного объема файла
            progressBar2.Value = 0;
            StreamReader sr = new StreamReader(@textBox2.Text);
            progressBar2.Maximum =(int)(sr.BaseStream.Length);//общий размер потока
            ConStr = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=" + maskedTextBox1.Text + ";PORT=3306;UID=" + maskedTextBox2.Text + ";PWD=" + maskedTextBox3.Text + ";DATABASE=" + comboBox3.Text + ";OPTION=3";
            OdbcCon = new System.Data.Odbc.OdbcConnection(ConStr);
            if (OdbcCon.State == ConnectionState.Closed)
            {
                OdbcCon.Open();
            }
            while ((str = sr.ReadLine()) != null)
            {
                if (str != "")
                {
                    Thread analystic = new Thread(line_analystic);
                    analystic.Start(str);
                    analystic.Join();
                    //line_analystic(str); 
                }
                progressBar2.Value = (int)(sr.BaseStream.Position);
            }
            
            sr.Close();
        }
а так-же чтении данных с ком порта в раельных условиях работает имменнов этом режим при надобности выложу сурсы и пример даных прикреплен.
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string row;
            row = (serialPort1.ReadLine());
            //Проверка подключения к БД
            if (OdbcCon.State == ConnectionState.Closed)
            {
                OdbcCon.Open();
            }
            //!Проверка подключения к БД
            if(row != "") 
            {
 
                Thread analystic = new Thread(line_analystic);
                analystic.Start(row);
                analystic.Join();
            }
            if (checkBox2.Checked == true)
            {
                textBox6.Text = textBox3.Text + DateTime.Now.ToString("dd.MM.yyyy") + ".log";
                log_write(row, textBox6.Text);
            }
            else
            {
                textBox6.Text = "Ведение логов отключено !!!";
            }
            richTextBox1.AppendText(row + "\n\r");
        }
помоги кто чем может ибо только начал разбератся а тут такой кирпич перед носом .... пытался раскидать по тредам (неселен в этом) но нечего это не дало (немного прибавило скорости). Попутный вопрос как сделать так чтобы треды виртуально были автономными ибо иногда при вополнении скюэль запросов появляются какието неверные данные поэтому пришлось поставить дожидатся завершения выполнения потока. правилам крсивого кодо-писания некто не учил поэтому написал в меру своих познаний если кто наставит на путь истеный буду благодарен.

Решение задачи: «The process was terminated due to an unhandled exception»

textual
Листинг программы
try{...}
catch(...){...}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5