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(); }
/// <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); } }
/// <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); } }
/// <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); } }
public SQLProvider([NotNull] ApplicationContext appContext, ISQLClientFactory sqlClientFactory) : base(appContext, SQLConstants.CreateProviderMetadata()) { _sqlClientFactory = sqlClientFactory; }