예제 #1
0
        public async Task <T> Handle(NpgsqlDataReader reader)
        {
            var meta    = ClassDbMeta <T> .Instance;
            var columns = await reader.GetColumnSchemaAsync();

            if (await reader.ReadAsync())
            {
                var t = Activator.CreateInstance <T>();
                foreach (DbColumn column in columns)
                {
                    var prop = meta.GetPropertyInfo(column.ColumnName);
                    if (prop == null)
                    {
                        continue;
                    }
                    int    ordinal  = column.ColumnOrdinal.Value;
                    Type   valueTyp = prop.PropertyType;
                    object value    = Tool.DefaultValueFormColumnToProp(reader, ordinal, valueTyp);
                    prop.SetValue(t, value);
                }
                return(t);
            }
            else
            {
                return(default);
예제 #2
0
        /// <summary>
        /// Executes a Query asynchronously
        /// </summary>
        /// <param name="context">Database Context</param>
        /// <param name="query">SQL</param>
        /// <param name="parameters">Parameters</param>
        /// <returns>awaitable Task</returns>
        public static async Task <IReadOnlyDictionary <string, object>[]> NpgsqlQueryAsync(this DatabaseContext context, string query, NpgsqlParameter[] parameters = null)
        {
            //Place to store Results
            List <IReadOnlyDictionary <string, object> > results = new();
            //Create and Open Connection
            NpgsqlConnection connection = new(context.GetNpgsqlConnectionString());
            await connection.OpenAsync();

            //Create command with `query` Command Text
            NpgsqlCommand cmd = connection.CreateCommand();

            cmd.CommandText = query;
            //Add Parameters if present
            if (parameters != null)
            {
                cmd.Parameters.AddRange(parameters);
            }
            //Execute Data Reader
            await using NpgsqlDataReader reader = await cmd.ExecuteReaderAsync();

            //Read Columns
            ReadOnlyCollection <NpgsqlDbColumn> columns = await reader.GetColumnSchemaAsync();

            //Read Results
            while (await reader.ReadAsync())
            {
                //Place to store Result
                Dictionary <string, object> result = new();
                //Create Object Array with the size of the amount of columns
                object[] values = new object[columns.Count];
                //Get Values
                reader.GetValues(values);
                //Iterate over each column
                for (int i = 0; i < columns.Count; i++)
                {
                    //Get Column
                    NpgsqlDbColumn column = columns[i];
                    //Add Result
                    result.Add(column.ColumnName, values[i]);
                }
                //Add Result to Results
                results.Add(result);
            }
            //Close Connection
            await connection.CloseAsync();

            //Return Results
            return(results.ToArray());
        }
예제 #3
0
 private async Task <ReadOnlyCollection <Schema.NpgsqlDbColumn> > GetColumnSchema(NpgsqlDataReader reader)
 => IsAsync ? await reader.GetColumnSchemaAsync() : reader.GetColumnSchema();