コード例 #1
0
        protected StandardRepository(TypeLookup typeLookup, SQLConstants sqlConstants, EntityUtils entityUtils, ExpressionUtils expressionUtils,
                                     ISQLExecutor <TCommand, TConnection, TParameter> sqlExecutor, List <string> updateableFields = null)
        {
            _typeLookup      = typeLookup;
            _sqlConstants    = sqlConstants;
            _entityUtils     = entityUtils;
            _expressionUtils = expressionUtils;
            SQLExecutor      = sqlExecutor;
            UpdateableFields = updateableFields;

            var entityType = typeof(T);

            Fields     = _entityUtils.GetProperties(entityType);
            BaseFields = _entityUtils.GetBaseProperties();
        }
コード例 #2
0
        /// <summary>
        /// Removes the current object from the database.
        /// </summary>
        /// <param name="connection">An opened <see cref="MySqlConnection"/>.</param>
        /// <returns>The number of affected rows.</returns>
        public int Delete(MySqlConnection connection)
        {
            using (var cmd = connection.CreateCommand())
            {
                var condition = GetIndex("PRIMARY") != null
                                        ? new MySqlConditionBuilder(this)
                                        : new MySqlConditionBuilder(Metadata.ToArray(), Fields);
                cmd.CommandText = SQLConstants.GetDelete(
                    Schema,
                    condition.ConditionString
                    );
                condition.MergeParameters(cmd);

                var cmdOut = cmd.ExecuteNonQuery();
                ClearTrace();
                return(cmdOut);
            }
        }
コード例 #3
0
        /// <summary>
        /// Updates the old object in the database with the current object.
        /// </summary>
        /// <param name="connection">An opened <see cref="MySqlConnection"/>.</param>
        /// <returns>The number of affected rows.</returns>
        public int Update(MySqlConnection connection)
        {
            if (fieldTrace == null)
            {
                throw new InvalidOperationException("This object cannot be traced back to the database.");
            }
            using (var cmd = connection.CreateCommand())
            {
                string addValues(ColumnMetadata meta, object value)
                {
                    if (value == null)
                    {
                        return($"`{meta.Column}` = NULL");
                    }
                    var paramName = $"@param{cmd.Parameters.Count}";

                    cmd.Parameters.Add(new MySqlParameter(paramName, meta.Type)
                    {
                        Value = value
                    });
                    return($"`{meta.Column}` = {paramName}");
                }

                var columnValuePairs = string.Join(", ", Metadata.Zip(Fields, (x, y) => addValues(x, y)));
                var condition        = GetIndex("PRIMARY") != null
                                        ? new MySqlConditionBuilder(this)
                                        : new MySqlConditionBuilder(Metadata.ToArray(), Fields);
                cmd.CommandText = SQLConstants.GetUpdate(
                    Schema,
                    columnValuePairs,
                    condition.ConditionString
                    );
                condition.MergeParameters(cmd);

                var cmdOut = cmd.ExecuteNonQuery();
                UpdateTrace();
                return(cmdOut);
            }
        }
コード例 #4
0
        /// <summary>
        /// Uploads the current object to the database.
        /// </summary>
        /// <param name="connection">An opened <see cref="MySqlConnection"/>.</param>
        /// <returns>The last insert id.</returns>
        public long Upload(MySqlConnection connection)
        {
            using (var cmd = connection.CreateCommand())
            {
                var paramNames = new string[Fields.Length];
                for (int i = 0; i < Fields.Length; i++)
                {
                    if (Fields[i] == null)
                    {
                        paramNames[i] = "NULL";
                        continue;
                    }
                    paramNames[i] = $"@param{i}";
                    cmd.Parameters.Add(new MySqlParameter(paramNames[i], Metadata[i].Type)
                    {
                        Value = Fields[i]
                    });
                }

                var columnInsert = string.Join(", ", GetColumns().Select(column => $"`{Schema}`.`{column}`"));
                var valueInsert  = string.Join(", ", paramNames);

                cmd.CommandText = SQLConstants.GetInsert(
                    Schema,
                    columnInsert,
                    valueInsert
                    );
                cmd.ExecuteNonQuery();
                var scalar = cmd.LastInsertedId;
                if (AutoIncrement != null)
                {
                    object o;
                    switch (AutoIncrement.Columns[0].Type)
                    {
                    // Convert type because for some reason casting a long that is an object to int is invalid, but casting a regular long is fine???
                    case MySqlDbType.Byte: o = (sbyte)scalar; break;

                    case MySqlDbType.UByte: o = (byte)scalar; break;

                    case MySqlDbType.Int16: o = (short)scalar; break;

                    case MySqlDbType.UInt16: o = (ushort)scalar; break;

                    case MySqlDbType.Int24:
                    case MySqlDbType.Int32: o = (int)scalar; break;

                    case MySqlDbType.UInt24:
                    case MySqlDbType.UInt32: o = (uint)scalar; break;

                    default:
                    case MySqlDbType.Int64: o = scalar; break;

                    case MySqlDbType.UInt64: o = (ulong)scalar; break;
                    }
                    Fields[Metadata.IndexOf(AutoIncrement.Columns[0])] = o;
                }

                UpdateTrace();
                return(scalar);
            }
        }
コード例 #5
0
 public SQLProvider([NotNull] ApplicationContext appContext, ISQLClientFactory sqlClientFactory)
     : base(appContext, SQLConstants.CreateProviderMetadata())
 {
     _sqlClientFactory = sqlClientFactory;
 }