Ошибка SqlDataReader.Read (), чтение значений из хранимой процедуры - PullRequest
0 голосов
/ 21 февраля 2020

Я новичок в ASP. NET, и у меня возникают проблемы с функцией API-контроллера. Я вызываю хранимую процедуру и отображаю результаты в модель, затем объединяю ее в список строк, но в конце кода она возвращает пустую строку. Я заметил, что выполнение пропускает блок while, и я не уверен почему, потому что когда я устанавливаю точки останова там, он не срабатывает.

это вывод хранимой процедуры, когда я запускаю в sqlserver

enter image description here

Это мой код:

UserModel

   using System;
   using System.ComponentModel.DataAnnotations;

   namespace Fnk.Models{
      public class UserModel{
        [Required]
        public string id {get; set;}
        [Required]
        public string Username{get; set;} 
        [Required]
        public string Email {get; set;} 
        [Required]
        public string UserRole {get; set;}
      }
   }

Api-контроллер - получает электронное письмо

        public IActionResult getusers([FromRoute] string email){

            string conn = Configuration.GetConnectionString("FintrakDBConnection");         
            var columns = new List<string>();  // List<string> pTypes;

            using (var con = new SqlConnection(conn)) {
                var cmd = new SqlCommand("scb_getUserRoles", con);
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.CommandTimeout = 0;
                cmd.Parameters.Add(new SqlParameter {
                    ParameterName = "email",
                    Value = email,
                });

               con.Open();

               using(SqlDataReader reader = cmd.ExecuteReader()){   ///code works up to this point

                   while(reader.Read()){   // breakpoint here shows the 4 columns... 

                        var obj = new UserModel(); 

                        if (reader["id"] != DBNull.Value) 
                            obj.id = reader["id"].ToString(); 

                        if (reader["UserName"] != DBNull.Value)
                            obj.Username = reader["UserName"].ToString(); 

                        if (reader["Email"] != DBNull.Value)
                            obj.Email = reader["Email"].ToString(); 

                        if (reader["RoleId"] != DBNull.Value) 
                            obj.UserRole = reader["RoleId"].ToString();

                        columns.Add(obj.id);  
                        columns.Add(obj.Username);      
                        columns.Add(obj.UserRole);  
                        columns.Add(obj.Email);     
                    }
                    reader.Close();
               }                  
                con.Close();
            }
            return Ok(columns.ToArray());  //returns an empty array.. dont know why
          }

В этот момент while(reader.Read()) система показывает, что она прочитала базу данных и обновила считыватель, но выполнение пропускает время, пока l oop и возвращает пустой массив.

Пожалуйста, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Я проверил согласно моим данным таблицы, которые прекрасно работают.

    string connectionString = @"data source=MS-KIRON-01;initial catalog=MSTestDB;integrated security=True;MultipleActiveResultSets=True";
    var columns = new List<string>();  // List<string> pTypes;

    using (var con = new SqlConnection(connectionString))
    {
        var cmd = new SqlCommand("SELECT Username, Email FROM TestTable", con);

        con.Open();

        using (SqlDataReader reader = cmd.ExecuteReader())
        {   ///code works up to this point
            if (reader.HasRows)
            {
                while (reader.Read())
                {   // breakpoint here shows the 4 columns... 

                    var obj = new UserModel();

                    if (reader["Username"] != DBNull.Value)
                        obj.Username = reader["Username"].ToString();

                    if (reader["Email"] != DBNull.Value)
                        obj.Email = reader["Email"].ToString();
                    columns.Add(obj.Username);
                    columns.Add(obj.Email);
                }

            }

            reader.Close();
        }
        con.Close();
    }
    return columns.ToArray();

Все выглядит хорошо, я не знаю, почему вы получаете нулевой массив. Одна модификация, которую я бы предложил if (reader.HasRows) {}, когда у вашего читателя нет какой-либо записи, из-за которой он будет обрабатывать исключение, вы можете использовать ее, как я уже прикрепил к моему примеру.

0 голосов
/ 21 февраля 2020

Вы уверены, что случайно не выполняете reader.Read() в окне наблюдения или в окне немедленного просмотра, как если бы была только одна запись, следующее чтение () будет ложным ...?

Примечание вы правильно использовали using, поэтому вам не нужно закрывать reader или con

...