Cómo leer datos de un lector de datos en una tabla de datos?

Tengo una clase base para ado.net las operaciones, que se parece a esto:

    public abstract class BaseDataAccess
    {
        private string _connectionString = ......

        protected string ConnectionString
        {
            get { return _connectionString; }
        }

        protected object ExecuteScalar(string spName, SqlParameter[] parameters=null)
        {
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                using (SqlCommand command = new SqlCommand(spName, connection))
                {
                    if (parameters != null)
                    {
                        command.Parameters.AddRange(parameters);
                    }
                    command.CommandType = System.Data.CommandType.StoredProcedure;
                    connection.Open();
                    return command.ExecuteScalar();
                }
            }            
        }

        protected DataTable ExecuteReader(string spName, SqlParameter[] parameters=null)
        {
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                using (SqlCommand command = new SqlCommand(spName, connection))
                {
                    if (parameters != null)
                    {
                        command.Parameters.AddRange(parameters);
                    }
                    command.CommandType = CommandType.StoredProcedure;
                    connection.Open();
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        DataTable table = new DataTable();                        
                        table.Load(reader);
                        return table;
                    }
                }
            }
        }
    }

Y una clase que consulta la tabla de usuarios

    public class UsersAccess : BaseDataAccess
    {
        private const string SP_COUNT_USERS = "spCountUsers";
        private const string SP_GET_USERS = "spGetUsers";

        public int CountUsers()
        {
            return (int)base.ExecuteScalar(SP_COUNT_USERS);
        }

        public IList<User> GetUsers()
        {
            DataTable usersTable = base.ExecuteReader(SP_GET_USERS);
            return GetUsersFromDataTable(usersTable);
        }

        private IList<User> GetUsersFromDataTable(DataTable usersTable)
        {
            IList<User> users = new List<User>();
            foreach (DataRow row in usersTable.Rows)
            {
                User user = new User();
                user.UserID = (int)row["UserID"];
                user.Password = (string)row["Password"];
                user.Username = (string)row["Username"];
            }
            return users;
        }
    }

El lector de datos viene con 2 filas de datos, pero cuando no hay datos se presenta en la tabla de datos.
Cómo lograr eso?

PS: consejos para una mejor clase base para ado.net sería genial. Sólo tengo unas tablas, y sólo unos pocos de los procedimientos/tabla.

InformationsquelleAutor gigi | 2012-08-09

1 Kommentar

  1. 2

    Falta el users.Add(user); al final de cada bucle

        private IList<User> GetUsersFromDataTable(DataTable usersTable) 
        { 
            IList<User> users = new List<User>(); 
            foreach (DataRow row in usersTable.Rows) 
            { 
                User user = new User(); 
                user.UserID = (int)row["UserID"]; 
                user.Password = (string)row["Password"]; 
                user.Username = (string)row["Username"]; 
                users.Add(user);
            } 
            return users; 
        }
    • oh mi dios. soy un idiota. gracias

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea