public virtual OperationBuilder <UpdateDataOperation> UpdateData( [NotNull] string table, [NotNull] string[] keyColumns, [NotNull] object[,] keyValues, [NotNull] string[] columns, [NotNull] object[,] values, [CanBeNull] string schema = null) { Check.NotEmpty(table, nameof(table)); Check.NotNull(keyColumns, nameof(keyColumns)); Check.NotNull(keyValues, nameof(keyValues)); Check.NotNull(columns, nameof(columns)); Check.NotNull(values, nameof(values)); var operation = new UpdateDataOperation { Table = table, Schema = schema, KeyColumns = keyColumns, KeyValues = keyValues, Columns = columns, Values = values }; Operations.Add(operation); return(new OperationBuilder <UpdateDataOperation>(operation)); }
protected virtual void Generate( [NotNull] UpdateDataOperation operation, [CanBeNull] IModel model, [NotNull] MigrationCommandListBuilder builder) { Check.NotNull(operation, nameof(operation)); Check.NotNull(builder, nameof(builder)); if (operation.Values.Length == 0) { return; } var rowCount = operation.Values.GetLength(0); var valueCount = operation.Values.GetLength(1); var keyValueCount = operation.KeyValues.GetLength(1); for (var i = 0; i < rowCount; i++) { builder .Append("UPDATE ") .AppendLine(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema)) .Append("SET "); for (var j = 0; j < valueCount; j++) { if (j != 0) { builder .AppendLine(",") .Append(" "); } var value = operation.Values[i, j]; var typeMapping = Dependencies.TypeMapper.GetMappingForValue(value); builder.Append( Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Columns[j]) + " = " + typeMapping.GenerateSqlLiteral(value)); } builder .AppendLine() .Append("WHERE ("); for (var j = 0; j < keyValueCount; j++) { if (j != 0) { builder.Append(" AND "); } builder.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.KeyColumns[j])); var value = operation.KeyValues[i, j]; if (value == null) { builder.Append(" IS NULL"); } else { var typeMapping = Dependencies.TypeMapper.GetMappingForValue(value); builder .Append(" = ") .Append(typeMapping.GenerateSqlLiteral(value)); } } builder .Append(")") .AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); EndStatement(builder); } }