2017-01-19 1 views
0

У меня возникла проблема сохранения результата запроса select в класс модели. Я новичок в MVC, так голый со мной, пожалуйста! :)Ошибка ввода нулей в Список объектов с использованием .net core mvc?

Я пытаюсь сопоставить значения, взятые из листа excel со значениями из локальной базы данных. Я продолжаю получать ошибку «Data is Null. Этот метод или свойство нельзя вызвать на значения Null» или что-то подобное. Я не думаю, что могу перейти в нуль, поскольку я запустил SQL-запрос, чтобы заменить все нули на 0. Мне также все равно, если null передан этим свойствам, поэтому либо сделать поля обнуляемыми, либо удалить нули работа ... Думаю?

Ниже мой код:

//initialize spreadsheet package, 
     //load excel file, create dictionary of 
     //naic/industry key/value pairs 
     SpreadsheetInfo.SetLicense("FREE-LIMITED-KEY"); 
     ExcelFile ef = ExcelFile.Load("C:/Data Sources/NAICS sheets/3-Digit-NAICS-Codes.xls"); 
     Dictionary<object, object> naics = new Dictionary<object, object>(); 

     //Connection string for local MSSQL database 
     SqlConnection con = new SqlConnection("Data Source=.\\SQLEXPRESS;Initial Catalog=gov_world;Integrated Security=True;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"); 


     //Create array of client objects returned from query 
     Client[] allRecords = null; 
     string sql = "SELECT v_company, client_pk, v_naic_1, v_naic_2, v_naic_3, v_naic_4, v_naic_5 FROM dbo._clients"; 

     //Iterate through elements of excel sheet, eventually inputting first column value 
     //as key and second column value as value in dictionary 
     foreach (ExcelWorksheet sheet in ef.Worksheets) 
     { 


      foreach (ExcelRow row in sheet.Rows) 
      { 
       object[] industry = new object[2]; 
       var count = 0; 

       //populate industry array with all values of row 
       foreach (ExcelCell cell in row.AllocatedCells) 
       { 
        if (cell.Value != null) 
        { 
         industry[count] = cell.Value; 
        } 
        count++; 
       } 
       count = 0; 

       //add values of first 2 cells to naics dictionary object 
       naics.Add(industry[0], industry[1]); 
       //Console.WriteLine(industry[0] + " | " + industry[1]); 

       //reinitialize for every record 
       industry[0] = 0; 
       industry[1] = 0; 

      } 
     } 


     //Set values from query to client model object, uses 
     //to populate allRecords Array 
     using (var command = new SqlCommand(sql, con)) 
     { 
      con.Open(); 
      using (var reader = command.ExecuteReader()) 
      { 
       var list = new List<Client>(); 
       while (reader.Read()) 
        list.Add(new Client { 
         //Solution: write as v_company = reader[0] as string; 
         v_company = reader.GetString(0), 
         client_pk = reader.GetInt32(1), 
         v_naic_1 = reader.GetString(2), 
         v_naic_2 = reader.GetString(3), 
         v_naic_3 = reader.GetString(4), 
         v_naic_4 = reader.GetString(5), 
         v_naic_5 = reader.GetString(6) 

        }); 
       allRecords = list.ToArray(); 

      } 
     } 


     Console.WriteLine(allRecords[0].v_naic_1); 
     Console.ReadLine(); 

Я могу понять спичку, на данный момент я просто хочу «list.Add (новый клиент ...» работать так, чтобы петля, а завершает . заранее спасибо, дайте мне знать, если есть больше информации я могу предоставить, чтобы помочь

+0

Вы должны использовать EF с MVC, но это не проблема, знаете ли вы, какая строка выдает ошибку? Или трассировать трассировку или что-нибудь еще? Также есть все ваши типы столбцов string/varchar? –

+0

Да, они являются строками/varchar, за исключением id. Хотелось использовать EF, но просто скопировало вставляемый шаблонный код, потому что я немного спешу и не разбираюсь в нем. Строкой, которая вызывает ошибку, является «while (reader.read()) list.Add .... и т. Д.». Посмотрел трассировку стека, не уверен, как размещать соответствующий материал здесь. Приходит с пустым перечислимым набором после примерно 150 000 записей. –

+0

«или что-то подобное» - почему бы не указать точное сообщение об ошибке для нас? Если у вас его нет, прямо сейчас запустите свою программу и запишите ее. Полное точное сообщение об ошибке вместе с тем, что его строка (и, возможно, полная трассировка стека), сделает отладку намного проще. Я предполагаю, что это, вероятно, дубликат http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it, но на данном этапе не может быть уверен без правильного сообщения об ошибке. – Chris

ответ

1

Вам нужно проверить IsDBNull для всех значений:

if(!reader.IsDBNull(0)) 
{ 
    employee.FirstName = sqlreader.GetString(0); 
} 

Или вы можете использовать его как

reader[0] as string 

Кроме того, было бы лучше использовать имена столбцов вместо значения индекса, вы можете получить индекс столбца из имени столбца следующим образом:

int colIndex = reader.GetOrdinal(fieldname); 

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

+1

Я думаю, что это именно то, что я искал ! Попытайтесь сейчас! –

+1

Работали как шарм, решение будет под вопросом. Благодаря! Лучший ответ –

Смежные вопросы