Pregunta

Como se copia DbCommand Parámetros a otro DbCommand, Quiero un nuevo DbCommand con los mismos parámetros que el último DbCommand. Pero ahora con una cadena SQL diferente.

¿Fue útil?

Solución

pudo Coloque el código que necesita para reutilizar en un método 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;
}

Otros consejos

¿Podrías 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());

Si todo lo que busca es la colección PARMS, puede probar un método de ayuda que crea una copia profunda de la colección .Parameters en su comando. Vea si esto escupirá lo que está buscando.

No puedo tomar el crédito por el método ObjectCopier, es solo un método de clase base útil que obtuve de un proyecto pasado.

    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);
            }
        }
    }   
// 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);

De una manera simple en vb.net

P es un sqlparameter entrante:

Dim p1 As SqlClient.SqlParameter = CType(CType(p, ICloneable).Clone, SqlClient.SqlParameter)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top