Member 13715690 Ответов: 1

Ссылка на объект не устанавливается на экземпляр объекта во время выполнения через командную строку


Я бегу из visual studio, дело было передано. Но при запуске того же самого из командной строки cmd с помощью dll-файла я сталкиваюсь с этой проблемой.


// Get the test data in table format and store it in DataRow type.
               DataTable DTExcelresult = IO.ReadExcel( excelLocation, methodName );
               for( int rowNo = 0; rowNo < DTExcelresult.Rows.Count; rowNo++)
               {
                   // Represents a row of data in a DataTable.
                   System.Data.DataRow resultRows = DTExcelresult.Rows[rowNo];

                   // Return the tesdata in DataRow type.
                   yield return new Tuple<System.Data.DataRow>( resultRows );

               } // end for


в первой строке этого кода происходит ошибка. Кто-нибудь знает, в чем может быть проблема.

Что я уже пробовал:

Я использовал лист excel для чтения данных

ZurdoDev

Что-то есть нуль.

1 Ответов

Рейтинг:
1

OriginalGriff

Это одна из самых распространенных проблем, которые нам задают, и это также та, на которую мы меньше всего готовы ответить, но вы больше всего готовы ответить сами.

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, который вы используете, чтобы держать ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень смешные взгляды, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего, что обычно делали бы, когда вы извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите свою программу в отладчике, и когда она выйдет из строя, VS покажет вам строку, в которой она обнаружила проблему. Затем вы можете начать просматривать различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы узнать, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз VS остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

Но мы не можем этого сделать - у нас нет вашего кода, мы не знаем, как его использовать, если бы он у нас был, у нас нет ваших данных. Так что попробуйте - и посмотрите, сколько информации вы можете узнать!


Member 13715690

Спасибо за ваш ответ, но когда я запустил его в режиме отладки, дело было передано. Только при запуске через командную строку это происходит

OriginalGriff

Поэтому вам нужно сделать это старомодным способом: добавить операторы ведения журнала в свой код, чтобы точно определить, где находится проблема и какое значение равно null. Затем уточните свой код регистрации, пока не узнаете *почему* он равен нулю!

Мы не можем сделать это для вас!

Dave Kreskowiak

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

Ваш код, по-видимому, предполагает, что каждый вызов метода или свойства успешно работают и возвращают то, что вы ожидаете. Что-то не возвращает объект, а вместо этого возвращает null. Затем вы пытаетесь использовать метод или свойство для нулевого объекта, и именно там вы получаете исключение.

Мы ничего не можем сделать для тебя.

Member 13715690

 public class IO
    {

        /// <summary>
        /// This method will initiate connection to open testdata document using OleDbConnection.
        /// </summary>
        /// <param name="excelPath">Path of the test data.</param>
        /// <returns>Returns the object initiated foe test data connection.</returns>
        private static OleDbConnection CreateExcelConnection(string excelPath)
        {
            // Provides connection information as a string.
            string oleDbCon = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; Jet OLEDB:Engine Type=5;Extended Properties=Excel 12.0;", excelPath);

            // An instance of the OleDbConnection class is initiated.
            return new OleDbConnection(oleDbCon);

        } 

        /// <summary>
        /// This method will read excel data.
        /// </summary>
        /// <param name="excelPath">Path of the test data.</param>
        /// <param name="methodName">Test method name.</param>
        /// <returns>Return test data value in DataTable format.</returns>
        public static DataTable ReadExcel(
                string excelPath, 
                string methodName)
        {

            // 'using' block to dispose the object once the connection is no more needed.
            using (var excelconnection = CreateExcelConnection(excelPath))
            {
                try
                {
                    string columnName = "S No";  // Column name 'Sno' is assigned.
                    string excelSheetName = methodName.Split('_')[1];  // Test sheet name for each case has been taken from method name.
                    
                    // Opens the excel connection to read data required for the test method.
                    excelconnection.Open();

                    // Initiating the DataTable class.
                    DataTable DTExcelresult = new DataTable();

                    // Fetches the data from excel. 
                    OleDbDataAdapter DataAdapter = new OleDbDataAdapter(string.Format("Select * from [{0}$] where UCase([" + columnName + "]) IS NOT NULL ", excelSheetName), excelconnection);

                    // Stores the test data in a table format.
                    DataAdapter.Fill(DTExcelresult);
                    
                    // Ends the excel connection.
                    excelconnection.Close();

                    // Retun the data in table format.
                    return DTExcelresult;

                } 

                catch (Exception exception)
                {
                    // Write the exception to console.
                    Console.WriteLine("Exception", exception);

                    // Return null.
                    return null;

                } 

            } 

        } 

    } 
это класс ввода-вывода, который мы вызываем для извлечения данных

OriginalGriff

Это не имеет значения. проблема заключается в ошибке времени выполнения - и это не происходит на вашем компьютере разработчика, так что либо она специфична для целевого компьютера, работает только на вашем компьютере, либо это проблема среды / настройки / приложений / конфигурации.
Независимо от того, что это такое, мы не можем воспроизвести проблему, поэтому мы даже не можем начать ее искать. Единственный человек, который может это сделать, - это вы, поэтому начните регистрировать то, что происходит и как это туда попало, и выясните, что неправильно / отсутствует / пусто / сломано. Пока вы этого не знаете, ничто не может быть надежно исправлено. И единственный способ, которым вы можете это выяснить ... чтобы начать регистрировать именно то, что происходит.

Member 13715690

На самом деле ошибка возникает в строке "excelconnection.Открывать();". Само соединение не открывается, а состояние соединения закрыто. Исключение произошло то же самое, о чем говорилось выше. Также я заметил еще одну вещь, когда бежал из каталога console System.IO.GetCurrentDirectory() путь к консоли и при запуске из IDE возвращает путь к решению. Как я могу получить путь решения даже при запуске через консоль из другого пути?