SqlDataReader Extentions - lobodava/artisan-orm GitHub Wiki

SqlDataReader extensions for reading data

Word "Read" in extension name means reading of one result set from one select.

After the reading, a Read extension checks if there is the next result set and, if any, moves the cursor to it calling NextResult() method. This allows to read multiple result sets one by one:

var grandRecord   = reader.ReadTo<GrandRecord>();
var records       = reader.ReadToList<Record>();
var childRecords  = reader.ReadToList<ChildRecord>();

Every Read extension has optional parameter bool getNextResult = true, so if it is required to stay on the current result set after reading, the call of NextResult() can be cancelled.

SqlDataReader extentions for data reading:

  • To extensions which use the Mappers:

    • reader.ReadTo<T>
    • reader.ReadToList<T>
    • reader.ReadToArray<T>
    • reader.ReadToObjectRow<T>
    • reader.ReadToObjectRows<T>
    • reader.ReadToDictionary<TKey,TValue>
  • As extensions which use the Auto-Mapping:

    • reader.ReadAs<T>
    • reader.ReadAsList<T>
    • reader.ReadAsArray<T>
    • reader.ReadAsObjectRow
    • reader.ReadAsObjectRows
    • reader.ReadAsDictionary<TKey,TValue>
  • Extension for reading data within action parameter:

    • reader.Read(Action)

Example:

public User GetById(int id)
{
    return GetByCommand(cmd =>
    {
        cmd.UseProcedure("dbo.GetUserById");
        cmd.AddIntParam("@Id", id);

        return cmd.GetByReader(reader =>
        {
            var user     = reader.ReadTo<User>();
            user.RoleIds = reader.ReadToArray<byte>();            
            
            return user;
        });
    });
}

Where the stored procedure dbo.GetUserById looks like this:

create procedure dbo.GetUserById
    @Id    int
as
begin
    set nocount on;

    -- read User

    select Id, [Login], Name, Email from dbo.Users where Id = @Id;

    -- read User RoleIds

    select RoleId from dbo.UserRoles where UserId = @Id;
end;

SqlDataReader extensions for getting data

The class 'SqlDataReader' (of System.Data.SqlClient namespace) has standard Get methods like: GetInt32, GetBoolean or GetString. The Get methods are used to read column values.

Within Artisan.Orm the Get methods are used in Mappers and in manual object properties reading.

Artisan.Orm extends the list of Get methods by adding the Nullable versions: GetInt32Nullable, GetBooleanNullable or GetStringNullable, and other useful methods:

"Get" extensions
GetBooleanNullable
GetByteNullable
GetBytesNullable
GetInt16Nullable
GetInt32Nullable
GetInt64Nullable
GetFloatNullable
GetDoubleNullable
GetBigDecimal
GetBigDecimalNullable
GetCharacter
GetCharacterNullable
GetStringNullable
GetDateTimeNullable
GetDateTimeOffsetNullable
GetTimeSpanNullable
GetGuidNullable
GetGuidFromString
GetGuidFromStringNullable
GetBytesFromRowVersion
GetInt64FromRowVersion
GetInt64FromRowVersionNullable
GetBase64StringFromRowVersion
GetByteArrayFromString
GetInt16ArrayFromString
GetInt32ArrayFromString

Examples:

public IList<User> GetUsersWithRoles()
{
    return GetByCommand(cmd =>
    {
        cmd.UseSql( "select * from dbo.vwUsers; " +
                    "select UserId, RoleId from dbo.UserRoles;" +
                    "select Id, Code, Name from dbo.Roles");

        return cmd.GetByReader(reader =>
        {
            var users = reader.ReadToList<User>();
            var userRoles = reader.ReadToList(r => new {UserId = r.GetInt32(0), RoleId = r.GetByte(1)});
            var roles = reader.ReadAsList<Role>();
                
            reader.Close();

            foreach (var user in users)
            {
                user.Roles = new List<Role>();

                foreach (var role in roles)
                    if (userRoles.Any(ur => ur.UserId == user.Id && ur.RoleId == role.Id))
                        user.Roles.Add(role);
            }

            return users;
        });
    });
}
⚠️ **GitHub.com Fallback** ⚠️