Domanda

Come si fa a copiare i parametri DbCommand ad un altro DbCommand, voglio una nuova DbCommand con gli stessi parametri come il mio ultimo DbCommand. Ma ora, con una stringa sql diversa.

È stato utile?

Soluzione

potrebbero mettere il codice è necessario ri-uso in un metodo separato:

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

Altri suggerimenti

si potrebbe fare qualcosa di simile?

  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());

Se tutto quello che sono dopo è la raccolta parms, si potrebbe provare un metodo di supporto che crea una copia completa della collezione .parameters sul vostro comando. Vedere se questo sarà sputare fuori quello che cercate.

Non può prendersi il merito per il metodo ObjectCopier, è solo un metodo della classe base utile che ho ricevuto da un progetto passato.

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

Un modo semplice in vb.net

p è uno SqlParameter in arrivo:

Dim p1 As SqlClient.SqlParameter = CType(CType(p, ICloneable).Clone, SqlClient.SqlParameter)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top