Skip to content

Commit 65f353f

Browse files
author
Alex Henderson
committed
Introduced a new Update method which takes a dictionary of string/object pairs (uses parameters on command, so it should have better support for long parameter values).
1 parent c36a9a2 commit 65f353f

File tree

3 files changed

+64
-2
lines changed

3 files changed

+64
-2
lines changed

src/Migrator.Framework/ITransformationProvider.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,16 @@ void GenerateForeignKey(string foreignTable, string foreignColumn, string primar
464464
/// <returns></returns>
465465
int Update(string table, string[] columns, string[] values, string where);
466466

467+
/// <summary>
468+
/// Update the values in a table, values are passed as objects so they can be
469+
/// passed by param in the underlying implementation
470+
/// </summary>
471+
/// <param name="table"></param>
472+
/// <param name="where"></param>
473+
/// <param name="changes"></param>
474+
/// <returns></returns>
475+
int Update(string table, string where, Dictionary<string,object> changes);
476+
467477
/// <summary>
468478
/// Get a command instance
469479
/// </summary>

src/Migrator.Providers/NoOpTransformationProvider.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,12 @@ public int Update(string table, string[] columns, string[] columnValues, string
247247
return 0;
248248
}
249249

250-
public int Delete(string table, string[] columns, string[] columnValues)
250+
public int Update(string table, string @where, Dictionary<string, object> changes)
251+
{
252+
return 0;
253+
}
254+
255+
public int Delete(string table, string[] columns, string[] columnValues)
251256
{
252257
return 0;
253258
}

src/Migrator.Providers/TransformationProvider.cs

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,54 @@ public virtual int Update(string table, string[] columns, string[] values, strin
626626
return ExecuteNonQuery(String.Format(query, table, namesAndValues));
627627
}
628628

629-
public virtual int Insert(string table, string[] columns, object[] values)
629+
public virtual int Update(string table, string where, Dictionary<string, object> changes)
630+
{
631+
if (string.IsNullOrEmpty(table)) throw new ArgumentNullException("table");
632+
633+
table = QuoteTableNameIfRequired(table);
634+
635+
var sets = new StringBuilder();
636+
637+
var columns = changes.Keys.ToArray();
638+
639+
for (int i = 0; i < columns.Length; i++)
640+
{
641+
var column = columns[i];
642+
if (sets.Length > 0) sets.Append(",\r\n");
643+
sets.AppendFormat("{0} = {1}", QuoteColumnNameIfRequired(column), GenerateParameterName(i));
644+
}
645+
646+
var query = String.Format("UPDATE {0} SET {1} ", table, sets);
647+
648+
if (!string.IsNullOrWhiteSpace(where))
649+
{
650+
query += "\r\n WHERE " + where;
651+
}
652+
653+
using (IDbCommand command = _connection.CreateCommand())
654+
{
655+
command.Transaction = _transaction;
656+
command.CommandText = query;
657+
command.CommandType = CommandType.Text;
658+
659+
for (int paramCount = 0; paramCount < columns.Length; paramCount++)
660+
{
661+
var value = changes[columns[paramCount]];
662+
663+
IDbDataParameter parameter = command.CreateParameter();
664+
665+
ConfigureParameterWithValue(parameter, paramCount, value);
666+
667+
parameter.ParameterName = GenerateParameterName(paramCount);
668+
669+
command.Parameters.Add(parameter);
670+
}
671+
672+
return command.ExecuteNonQuery();
673+
}
674+
}
675+
676+
public virtual int Insert(string table, string[] columns, object[] values)
630677
{
631678
if (string.IsNullOrEmpty(table)) throw new ArgumentNullException("table");
632679
if (columns == null) throw new ArgumentNullException("columns");

0 commit comments

Comments
 (0)