Skip to main content
Tweeted twitter.com/StackCodeReview/status/1494235172245544960
added 122 characters in body
Source Link
Kirsten
  • 443
  • 1
  • 5
  • 18

[Update]

Exploring ISR5's answer I get

this error message

[Update]

Exploring ISR5's answer I get

this error message

added 1946 characters in body
Source Link
Kirsten
  • 443
  • 1
  • 5
  • 18

[Update]

The helper code is

public static class DataHelpers
{
    public static List<T> RawSqlQuery<T>(string query, Func<DbDataReader, T> map, params SqlParameter[] parameters)
    {
        try
        {
            using var context = MakeDbContext();
            return RunQuery(context, query, map, parameters);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }
    public static List<T> RunQuery<T>(MyDbContext context, string query, Func<DbDataReader, T> map,
        params SqlParameter[] parameters)
    {
        try
        {
            var cn = context.Database.GetDbConnection();
            var oldState = cn.State;
            if (cn.State.Equals(ConnectionState.Closed)) cn.Open();
            using var command = cn.CreateCommand();
            command.CommandText = query;
            command.CommandType = CommandType.Text;
            foreach (var param in parameters) command.Parameters.Add(param);
            if (cn.State.Equals(ConnectionState.Closed)) cn.Open();
            var entities = new List<T>();
            using (var result = command.ExecuteReader())
            {
                while (result.Read())
                {
                    var r = map(result);
                    entities.Add(r);
                }
            }

            if (oldState.Equals(ConnectionState.Closed) && cn.State == ConnectionState.Open) cn.Close();
            return entities;
        }
        catch (Exception e)
        {
            MessageBox.Show($"RunQuery inner: {e.InnerException}, ex:{e} \r\n {query}");
            Console.WriteLine(e);
            throw;
        }

    }

[Update]

The helper code is

public static class DataHelpers
{
    public static List<T> RawSqlQuery<T>(string query, Func<DbDataReader, T> map, params SqlParameter[] parameters)
    {
        try
        {
            using var context = MakeDbContext();
            return RunQuery(context, query, map, parameters);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }
    public static List<T> RunQuery<T>(MyDbContext context, string query, Func<DbDataReader, T> map,
        params SqlParameter[] parameters)
    {
        try
        {
            var cn = context.Database.GetDbConnection();
            var oldState = cn.State;
            if (cn.State.Equals(ConnectionState.Closed)) cn.Open();
            using var command = cn.CreateCommand();
            command.CommandText = query;
            command.CommandType = CommandType.Text;
            foreach (var param in parameters) command.Parameters.Add(param);
            if (cn.State.Equals(ConnectionState.Closed)) cn.Open();
            var entities = new List<T>();
            using (var result = command.ExecuteReader())
            {
                while (result.Read())
                {
                    var r = map(result);
                    entities.Add(r);
                }
            }

            if (oldState.Equals(ConnectionState.Closed) && cn.State == ConnectionState.Open) cn.Close();
            return entities;
        }
        catch (Exception e)
        {
            MessageBox.Show($"RunQuery inner: {e.InnerException}, ex:{e} \r\n {query}");
            Console.WriteLine(e);
            throw;
        }

    }
edited tags
Source Link
Reinderien
  • 71.2k
  • 5
  • 76
  • 257

Is there a way to make the following code more maintainable?

 public static DtoNumOrderedNumDone GetNumOrderedNumDone(int jobTaskId)
{
    const string selectList = "Quantity, NumDone";
    var sql =
        @$"select  convert(int,numordered) as Quantity , convert(int,sum(isnull(numDone,0)))  as NumDone
            from task k left outer join taskdone d on k.jobtaskid = d.jobtaskid 
            inner join job j on k.jobid = j.jobid 
            where k.jobtaskid = {jobTaskId}
            group by k.jobtaskid, j.NumOrdered";

    var tokens = selectList.Tokenize();
    var quantityOrdinal = Array.IndexOf(tokens, "Quantity");
    var numdoneOrdinal = Array.IndexOf(tokens, "NumDone");
    var dtos = DataHelpers.RawSqlQuery(sql, x => new DtoNumOrderedNumDone()
    {
        NumDone = x.GetInt32(numdoneOrdinal),
        Quantity = x.GetInt32(quantityOrdinal)
    }
    );
    var dto = dtos.FirstOrDefault();
    return dto;
}

I aren't worried about sql injection because jobTaskId is an int, however I am worried that the code is vulnerable to being altered later and the field order being made incorrect.

Is there a way to make the following code more maintainable?

 public static DtoNumOrderedNumDone GetNumOrderedNumDone(int jobTaskId)
{
    const string selectList = "Quantity, NumDone";
    var sql =
        @$"select  convert(int,numordered) as Quantity , convert(int,sum(isnull(numDone,0)))  as NumDone
            from task k left outer join taskdone d on k.jobtaskid = d.jobtaskid 
            inner join job j on k.jobid = j.jobid 
            where k.jobtaskid = {jobTaskId}
            group by k.jobtaskid, j.NumOrdered";

    var tokens = selectList.Tokenize();
    var quantityOrdinal = Array.IndexOf(tokens, "Quantity");
    var numdoneOrdinal = Array.IndexOf(tokens, "NumDone");
    var dtos = DataHelpers.RawSqlQuery(sql, x => new DtoNumOrderedNumDone()
    {
        NumDone = x.GetInt32(numdoneOrdinal),
        Quantity = x.GetInt32(quantityOrdinal)
    }
    );
    var dto = dtos.FirstOrDefault();
    return dto;
}

I aren't worried about sql injection because jobTaskId is an int, however I am worried that the code is vulnerable to being altered later and the field order being made incorrect.

Is there a way to make the following code more maintainable?

public static DtoNumOrderedNumDone GetNumOrderedNumDone(int jobTaskId)
{
    const string selectList = "Quantity, NumDone";
    var sql =
        @$"select  convert(int,numordered) as Quantity , convert(int,sum(isnull(numDone,0)))  as NumDone
            from task k left outer join taskdone d on k.jobtaskid = d.jobtaskid 
            inner join job j on k.jobid = j.jobid 
            where k.jobtaskid = {jobTaskId}
            group by k.jobtaskid, j.NumOrdered";

    var tokens = selectList.Tokenize();
    var quantityOrdinal = Array.IndexOf(tokens, "Quantity");
    var numdoneOrdinal = Array.IndexOf(tokens, "NumDone");
    var dtos = DataHelpers.RawSqlQuery(sql, x => new DtoNumOrderedNumDone()
    {
        NumDone = x.GetInt32(numdoneOrdinal),
        Quantity = x.GetInt32(quantityOrdinal)
    }
    );
    var dto = dtos.FirstOrDefault();
    return dto;
}

I aren't worried about sql injection because jobTaskId is an int, however I am worried that the code is vulnerable to being altered later and the field order being made incorrect.

edited tags
Link
Loading
Source Link
Kirsten
  • 443
  • 1
  • 5
  • 18
Loading