2011-01-24 3 views

ответ

2

Вы могли поставить код, который нужно повторно использовать в отдельный метод:

public DbCommand RecycledParameters(string sql, IList<DbParameter> parameters) 
{ 
    var result = db.GetSqlStringCommand(sql); 
    foreach(DbParameter p in parameters) 
    { 
     db.AddInParameter(result, p.ParameterName, p.DbType, p.Value); 
    } 
    return result; 
} 
+0

есть ли другой способ. Если бы я сделал это, мне пришлось бы создать функцию для каждого переработанного параметра, который у меня есть. –

+0

Передайте их как параметры. (См. Мой обновленный ответ) –

+0

Как создать новый экземпляр DBCommand? Прототип метода должен быть общедоступным DBCommand AddParameters (параметры DBCommand dbCommand, DBParameterCollection); теперь вызывающий может передать любой тип, который выводится из DBCommand для первого параметра и для второго типа param, который происходит из DBParameterCollection. ex: AddParams (sqlCommand, sqlParameterCollection) –

1

Если все вы после это коллекция Parms, вы можете попробовать вспомогательный метод, который создает глубокую копию коллекции .parameters по вашей команде. Посмотрите, будет ли это выплюнуть то, что вы ищете.

Я не могу взять кредит за метод ObjectCopier, это просто полезный метод базового класса, который я получил из прошлого проекта.

private DbParameterCollection cloneParms(DbCommand commandWithParms) 
    { 
     return ObjectCopier.Clone<DbParameterCollection>(commandWithParms.Parameters); 
    } 

    public static class ObjectCopier 
    { 
     /// <summary> 
     /// Perform a deep Copy of the object. 
     /// </summary> 
     /// <typeparam name="T">The type of object being copied.</typeparam> 
     /// <param name="source">The object instance to copy.</param> 
     /// <returns>The copied object.</returns> 
     public static T Clone<T>(T source) 
     { 
      if (!typeof(T).IsSerializable) 
      { 
       throw new ArgumentException("The type must be serializable.", "source"); 
      } 

      // Don't serialize a null object, simply return the default for that object 
      if (Object.ReferenceEquals(source, null)) 
      { 
       return default(T); 
      } 

      IFormatter formatter = new BinaryFormatter(); 
      Stream stream = new MemoryStream(); 
      using (stream) 
      { 
       formatter.Serialize(stream, source); 
       stream.Seek(0, SeekOrigin.Begin); 
       return (T)formatter.Deserialize(stream); 
      } 
     } 
    } 
3

Вы могли бы сделать что-то вроде этого?

System.Data.Common.DbCommand command = new System.Data.SqlClient.SqlCommand(); 
    System.Data.Common.DbCommand command1 = new System.Data.SqlClient.SqlCommand(); 

    command1.Parameters.AddRange(command.Parameters.Cast<System.Data.Common.DbParameter>().ToArray()); 
+0

Это не сработает, потому что вы не можете добавлять параметры из одной команды в другую, 'Add' распознает ее и выдает' ArgumentException'. https://msdn.microsoft.com/en-us/library/ht4eset1(v=vs.110).aspx 'Cast' +' ToArray' изменяет коллекцию, а не параметры, они все равно являются теми же экземплярами. –

1
// Copy parameters from cmd1 to cmd2 
// Creates an array with new parameters 
var nsp = cmd1.Parameters.Cast<ICloneable>().Select(x => x.Clone() as SqlParameter).Where(x => x != null).ToArray(); 
// Copy parameters into another command 
cmd2.Parameters.AddRange(nsp);