Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 CLR not debugging  [new]
hosTuk
Member

Откуда:
Сообщений: 455
Написал CLR процедуру, отлаживал на локальном, все было четко, мог делать дебаг.

Выкладываю на основной сервер, не могу сделать дебаг, ремоут дебаггер включен, весь код clr завернул в try сделал insert в бд. Получил "Input string was not in a correct format."

[Microsoft.SqlServer.Server.SqlProcedure]
public static void spParseFileBillet(SqlString fileName)

Не понимаю, в чем косяк.
Microsoft SQL Server 2005 - 9.00.5057.00 (X64)   Mar 25 2011 13:33:31   Copyright (c) 1988-2005 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2) 
9 апр 12, 11:14    [12386307]     Ответить | Цитировать Сообщить модератору
 Re: CLR not debugging  [new]
hosTuk
Member

Откуда:
Сообщений: 455
Вызов

exec dbo.spParseFileBillet N'\\izh-ssrv04\Report\Ves.txt'

и такой вызов

exec dbo.spParseFileBillet N'd:\1\Ves.txt'

Одинаковые результаты
9 апр 12, 11:20    [12386351]     Ответить | Цитировать Сообщить модератору
 Re: CLR not debugging  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
hosTuk, ошибка в 17 строке.
9 апр 12, 11:21    [12386353]     Ответить | Цитировать Сообщить модератору
 Re: CLR not debugging  [new]
hosTuk
Member

Откуда:
Сообщений: 455
kDnZP,
+1 :)

Вот быдлокод


    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void spParseFileBillet(SqlString fileName)
    {
        ReaderBillet readerBillet = new ReaderBillet(fileName.Value);
        readerBillet.FormBillet();
    }



namespace ParseBilletFileMNLZ
{
    public struct InfoHeaderHeat
    {        
        public int NumHeat;
        public DateTime DateHeat;
        public DateTime DatePrimaryHeat;
        public string StrDateHeat
        {
            get { return DateHeat.ToString(ConfDateFormat.Object.ShortDatePattern); }
        }
        public string FilePath;
    }
    public struct InfoBillet
    {
        public string StrDate;
        public string StrTime;

        public int NumGroove;
        public double Weight; 
        public int CountBillet;

        public int NumEndRow;

        public DateTime FullDateFromStr
        {
            get
            {
                return DateTime.ParseExact(StrDate+" "+StrTime, ConfDateFormat.Object.LongDatePattern, null);
            }
        }
        public DateTime FullDate;
    }

    public struct UnionInfoBillet
    {
        public InfoHeaderHeat InfoHeaderHeat;  
        public InfoBillet InfoBillet;
    }

    class ReaderBillet
    {
        private string fileName;
        private SqlConnection conn;                 
        private string[] strsFile;
        private int idBilletFile = -1;
        private int countError = 0;
        private TimeSpan lastTimeSpan = new TimeSpan(0,0,0);

        public ReaderBillet(string fileName)
        {
            this.fileName = fileName;
            conn = new SqlConnection(@"context connection=true");
            strsFile = File.ReadAllLines(fileName);            

            conn.Open();
        }
        ~ReaderBillet()
        {
            if (conn.State == ConnectionState.Open) { conn.Close(); }
        }
        private UnionInfoBillet getInfoEndRowFromBase()
        {
            UnionInfoBillet result = new UnionInfoBillet();
            result.InfoHeaderHeat.NumHeat = -1;

            SqlCommand command = new SqlCommand(
                @"SELECT TOP(1)[id_Billet]
                      ,[NumHeat]
                      ,[DateBillet]
                      ,[NumRow]
                      ,[id_BilletFile]
                      ,[FilePath]
                      ,[DateStartImport]
                      ,[TruncateDatePlavka]
                      ,[TruncateDateBillet]
                  FROM [primaryMnlz].[vwImportBillet]
                  order by id_Billet desc, DateBillet asc", conn);

            SqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                result.InfoHeaderHeat.NumHeat = (int)reader["NumHeat"];
                result.InfoHeaderHeat.FilePath = reader["FilePath"].ToString();
                result.InfoHeaderHeat.DateHeat = (DateTime)reader["TruncateDateBillet"];    // this is no error
                result.InfoHeaderHeat.DatePrimaryHeat = (DateTime)reader["TruncateDatePlavka"];    // this is no error 

                result.InfoBillet.FullDate = (DateTime)reader["DateBillet"];
                result.InfoBillet.NumEndRow = (int)reader["NumRow"];

                string time = result.InfoBillet.FullDate.ToString(ConfDateFormat.Object.ShortTimePattern);

                lastTimeSpan = new TimeSpan(Ancillary.PartTime("hour", time), Ancillary.PartTime("minute", time), Ancillary.PartTime("second", time));
            }
            reader.Close();
            return result;
        }

        private InfoHeaderHeat readHeaderHeatFromStr(string str)
        {
            InfoHeaderHeat result = new InfoHeaderHeat();

            result.DateHeat = DateTime.ParseExact(Ancillary.SubStrAfterSignPart(" ", str, 1), ConfDateFormat.Object.ShortDatePattern, null);
            result.NumHeat = Convert.ToInt32(Ancillary.SubStrAfterSignPart(" ", str, 4));

            return result;
        }

        private int getStartNumPlavka(UnionInfoBillet infoLastRowBillet)
        {
            int result = -1;
            for (int i = infoLastRowBillet.InfoBillet.NumEndRow; i >= 0; i--)
            {
                string curStr = strsFile[i];
                if (curStr.Contains("Date"))
                {
                    InfoHeaderHeat infoHeaderHeat = readHeaderHeatFromStr(curStr);
                    
                    if (infoHeaderHeat.DateHeat.Equals(infoLastRowBillet.InfoHeaderHeat.DatePrimaryHeat) && (infoHeaderHeat.NumHeat == infoLastRowBillet.InfoHeaderHeat.NumHeat)) 
                    {
                        result = i;
                        break;
                    }                    
                }
            }
            return result;
        }

        private int startImportBillet()
        {
            SqlCommand command = new SqlCommand(
                @"  declare @idInsertTable int
                    EXECUTE @idInsertTable=[primaryMnlz].[spStartImportBillet] @FilePath
                    select @idInsertTable", conn);
            command.Parameters.Add(new SqlParameter("FilePath", fileName));
            return  Convert.ToInt32(command.ExecuteScalar());            
        }

        public void FormBillet()
        {
            UnionInfoBillet infoLastRowBillet;

            try
            {
                idBilletFile = startImportBillet();

                infoLastRowBillet = getInfoEndRowFromBase();

                if (fileName.ToLower().Equals(infoLastRowBillet.InfoHeaderHeat.FilePath.ToLower()))
                {
                    if (infoLastRowBillet.InfoBillet.NumEndRow + 1 < strsFile.Length)          // New info in same file
                    {
                        ReadNewDataSameFile(infoLastRowBillet);
                    }
                    else if (infoLastRowBillet.InfoBillet.NumEndRow + 1 == strsFile.Length)    // this file not have been changed
                    {
                        return;
                    }
                    else if (infoLastRowBillet.InfoBillet.NumEndRow + 1 > strsFile.Length)     // new file. truncate file. other reason ??? 
                    {
                        readNewFile();
                    }
                }
                else // new file ???
                {
                    readNewFile();
                }
            }
            catch(Exception e)
            {
                AddErrorImport("Завершение процедуры. " + e.Message);
            }
            finally
            {
                if (idBilletFile !=-1)  EndImportBillet(idBilletFile);
            }
        }

        private void EndImportBillet(int idBilletFile)
        {
            SqlCommand comand = new SqlCommand("exec [primaryMnlz].spEndImportBillet @id_BilletFile", conn);
            comand.Parameters.Add(new SqlParameter("id_BilletFile", idBilletFile));
            comand.ExecuteNonQuery();
        }

        private void readNewFile()
        {
            int startNum = -1;
            UnionInfoBillet unionInfoBillet= new UnionInfoBillet();

            for (int i = 0; i < strsFile.Length; i++)
            {
                if (strsFile[i].Contains("Date"))
                {
                    unionInfoBillet.InfoHeaderHeat = readHeaderHeatFromStr(strsFile[i]);
                    startNum = i;
                    break;
                }
            }
            if (startNum != -1)
            {
                for (int i = startNum; i < strsFile.Length; i++)
                {
                    AddRow(i, ref unionInfoBillet);
                }
            }
        }

        private void ReadNewDataSameFile(UnionInfoBillet infoLastRowBillet)
        {
            int numRow = infoLastRowBillet.InfoBillet.NumEndRow + 1;
            int startNumRowPlavka = getStartNumPlavka(infoLastRowBillet);

            if (startNumRowPlavka != -1)                                // continue read file
            {
                UnionInfoBillet curInfo = infoLastRowBillet;
                for (int i = numRow; i < strsFile.Length; i++)
                {
                    AddRow(i, ref curInfo);
                }
            }
            else                                                        // something has happened
            {
            }
        }

        private InfoBillet readBilletFromStr(string str)
        {
            InfoBillet result = new InfoBillet();

            result.NumGroove = Convert.ToInt32(Ancillary.SubStrAfterSignPart(" ", str, 0));
            result.StrTime = Ancillary.SubStrAfterSignPart(" ", str, 1);
            result.Weight = Convert.ToDouble(Ancillary.SubStrAfterSignPart(" ", str, 2));
            result.CountBillet = Convert.ToInt32(Ancillary.SubStrAfterSignPart(" ", str, 5));

            return result;
        }

        private void AddToBaseInfoBillet(UnionInfoBillet infoBillet)
        {
            SqlCommand command = new SqlCommand(
                    @"EXECUTE  [primaryMnlz].[spAddBillet] 
                           @NumHeat
                          ,@DateBillet
                          ,@NumGroove
                          ,@Weight
                          ,@CountBillet
                          ,@NumRow
                          ,@id_BilletFile_fk
                    ", conn);
            command.Parameters.Add(new SqlParameter("NumHeat", infoBillet.InfoHeaderHeat.NumHeat));
            command.Parameters.Add(new SqlParameter("DateBillet", infoBillet.InfoBillet.FullDateFromStr));
            command.Parameters.Add(new SqlParameter("NumGroove", infoBillet.InfoBillet.NumGroove));
            command.Parameters.Add(new SqlParameter("Weight", infoBillet.InfoBillet.Weight));
            command.Parameters.Add(new SqlParameter("CountBillet", (infoBillet.InfoBillet.CountBillet==0?1:infoBillet.InfoBillet.CountBillet)));
            command.Parameters.Add(new SqlParameter("NumRow", infoBillet.InfoBillet.NumEndRow));
            command.Parameters.Add(new SqlParameter("id_BilletFile_fk", idBilletFile));

            try
            {
                command.ExecuteNonQuery();
            }
            catch(Exception e)
            {
                if (++countError < 30)
                    AddErrorImport(e.Message + ". Номер строки: " + infoBillet.InfoBillet.NumEndRow.ToString() + ". idBilletFile: " + idBilletFile.ToString());
                else
                {
                    AddErrorImport("Завершение процедуры. Ошибок более 30. " + e.Message + ". Номер строки: " + infoBillet.InfoBillet.NumEndRow.ToString() + ". idBilletFile: " + idBilletFile.ToString());
                    throw new Exception(" My exception and my call. Return exception on top level");
                }
            }
        }

        private void AddErrorImport(string textError)
        {
            SqlCommand command = new SqlCommand(
                "exec primaryMnlz.spAddErrorImport @TextError", conn);
            command.Parameters.Add(new SqlParameter("TextError", textError));
            command.ExecuteNonQuery();            
        }

        private void AddRow(int NumRow, ref UnionInfoBillet curInfo)
        {
            string curStr = strsFile[NumRow];

            if (curStr.Contains("Date"))                        // new plavka
            {
                curInfo.InfoHeaderHeat = readHeaderHeatFromStr(curStr);
                lastTimeSpan = new TimeSpan();
            }
            else                                                // add new info for existing plavka
            {
                curInfo.InfoBillet = readBilletFromStr(curStr);

                string curStrTime = curInfo.InfoBillet.StrTime;
                TimeSpan curTimeSpan = new TimeSpan(Ancillary.PartTime("hour", curStrTime), Ancillary.PartTime("minute", curStrTime), Ancillary.PartTime("second", curStrTime));

                if (lastTimeSpan.Ticks != 0)
                {
                    if (curTimeSpan.Subtract(lastTimeSpan).Ticks < 0) curInfo.InfoHeaderHeat.DateHeat=curInfo.InfoHeaderHeat.DateHeat.AddDays(1.0);
                }
                lastTimeSpan = curTimeSpan;
             
                curInfo.InfoBillet.StrDate = curInfo.InfoHeaderHeat.StrDateHeat;                 
                curInfo.InfoBillet.NumEndRow = NumRow;

                AddToBaseInfoBillet(curInfo);
            }
        }
    }
}


Кому-то охота смотреть?
9 апр 12, 11:45    [12386529]     Ответить | Цитировать Сообщить модератору
 Re: CLR not debugging  [new]
hosTuk
Member

Откуда:
Сообщений: 455
Вопрос то еще в том, почему не могу сделать дебагинг.
Просто это не первая вещь написанная и отлаживаемая на CLR.
9 апр 12, 11:50    [12386559]     Ответить | Цитировать Сообщить модератору
 Re: CLR not debugging  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
hosTuk, внимательно не глядел, но то что есть преобразования строка - дата настораживает...
Как итог - поглядел бы в сторону
SET LANGUAGE
SET DATEFORMAT

как минимум. Ну а вобщем-то не мешало бы поглядеть и на содержимое файла, который пытаетесь парсить.
9 апр 12, 12:05    [12386664]     Ответить | Цитировать Сообщить модератору
 Re: CLR not debugging  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
hosTuk
Вопрос то еще в том, почему не могу сделать дебагинг.
Просто это не первая вещь написанная и отлаживаемая на CLR.

Пишите в лог, так можно отладиться и без отладчика.
9 апр 12, 12:06    [12386671]     Ответить | Цитировать Сообщить модератору
 Re: CLR not debugging  [new]
hosTuk
Member

Откуда:
Сообщений: 455
kDnZP,

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

В итоге ваши догадки были правильными, все оказалось просто.
Разделить на производственном был запятой, а не точкой :)
9 апр 12, 13:34    [12387313]     Ответить | Цитировать Сообщить модератору
 Re: CLR not debugging  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
hosTuk
kDnZP,

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

В итоге ваши догадки были правильными, все оказалось просто.
Разделить на производственном был запятой, а не точкой :)


9 апр 12, 13:46    [12387403]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить