예제 #1
0
        public List <T2> ExecuteConstructedGetListStatement <T1, T2>(T1 id, Dictionary <string, object> criteria)
        {
            List <T2>          results     = new List <T2>();
            uint               statementId = Convert.ToUInt32(id);
            DbGetListAttribute getList     = typeof(T2).GetCustomAttributes(false)?.OfType <DbGetListAttribute>()?.FirstOrDefault(d => d.ConstructedStatementId == statementId);

            StoredPreparedStatement preparedStatement;

            if (!preparedStatements.TryGetValue(Convert.ToUInt32(id), out preparedStatement))
            {
                Debug.Assert(preparedStatement != null, "Invalid prepared statement id.");
                return(null);
            }

            try
            {
                using (var connection = new MySqlConnection(connectionString))
                {
                    using (var command = new MySqlCommand(preparedStatement.Query, connection))
                    {
                        var properties = GetPropertyCache(typeof(T2));
                        foreach (var p in properties)
                        {
                            if (getList.ParameterFields.Contains(p.Item2.DbFieldName))
                            {
                                command.Parameters.Add("", (MySqlDbType)p.Item2.DbFieldType).Value = criteria[p.Item2.DbFieldName];
                            }
                        }

                        connection.Open();
                        using (var commandReader = command.ExecuteReader(CommandBehavior.Default))
                        {
                            while (commandReader.Read())
                            {
                                T2 o = Activator.CreateInstance <T2>();
                                foreach (var p in properties)
                                {
                                    p.Item1.SetValue(o, commandReader[p.Item2.DbFieldName]);
                                }

                                results.Add(o);
                            }
                        }
                    }
                }
            }
            catch (MySqlException exception)
            {
                log.Error($"An exception occured while executing prepared statement {id}!");
                log.Error($"Exception: {exception.Message}");
            }

            return(results);
        }
예제 #2
0
        private void ConstructGetListStatement <T1>(T1 id, Type type)
        {
            uint               statementId = Convert.ToUInt32(id);
            DbTableAttribute   dbTable     = type.GetCustomAttributes(false)?.OfType <DbTableAttribute>()?.FirstOrDefault();
            DbGetListAttribute getList     = type.GetCustomAttributes(false)?.OfType <DbGetListAttribute>()?.FirstOrDefault(d => d.ConstructedStatementId == statementId);

            if (dbTable == null)
            {
                Debug.Assert(false, $"Statement Construction failed for type {type}");
            }

            if (getList == null)
            {
                Debug.Assert(false, $"Statement Construction failed for type {type}");
            }

            List <MySqlDbType> types = new List <MySqlDbType>();
            var    properties        = GetPropertyCache(type);
            string tableName         = getList.TableName;
            string selectList        = null;
            string whereList         = null;

            foreach (var p in properties)
            {
                if (p.Item2.Get)
                {
                    if (selectList != null)
                    {
                        selectList += ", ";
                    }
                    selectList += "`" + p.Item2.DbFieldName + "`";
                }

                if (getList.ParameterFields.Contains(p.Item2.DbFieldName))
                {
                    if (whereList != null)
                    {
                        whereList += " AND ";
                    }
                    whereList += "`" + p.Item2.DbFieldName + "` = ?";
                    types.Add((MySqlDbType)p.Item2.DbFieldType);
                }
            }

            string query = $"SELECT {selectList} FROM `{tableName}` WHERE {whereList}";

            PrepareStatement(statementId, query, types);
        }