2011-01-24 25 views

Respuesta

2

Usted podría poner el código que necesita para volver a usar en un procedimiento separado:

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

¿hay alguna otra manera. Si hiciera esto, tendría que crear una función para cada parámetro reciclado que tenga. –

+0

Pase esos como parámetros también. (Vea mi respuesta actualizada) –

+0

¿cómo pueden crear una nueva instancia de DBCommand? El prototipo del método debería haber sido DBCommand AddParameters públicos (parámetros DBCommand dbCommand, DBParameterCollection); ahora la persona que llama podría pasar cualquier tipo que derive de DBCommand para el primer param y para el segundo tipo de param que se deriva de DBParameterCollection. ej .: AddParams (sqlCommand, sqlParameterCollection) –

1

Si todo lo que está después es la colección parms, podría intentar un método de ayuda que crea una copia profunda de la colección .parameters en tu comando. Vea si esto escupirá lo que está buscando.

No me puedo atribuir el mérito del método ObjectCopier, es solo un método de clase base útil que obtuve de un proyecto anterior.

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

¿podría hacer algo como esto?

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

Esto no funcionará porque no puede agregar parámetros de un comando a otro, 'Add' lo reconocerá y arrojará una' ArgumentException'. https://msdn.microsoft.com/en-us/library/ht4eset1(v=vs.110).aspx El 'Cast' +' ToArray' cambiará la colección, no los parámetros, siguen siendo las mismas instancias. –

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); 
Cuestiones relacionadas