Копировать параметры из DbCommand в другой DbCommand - PullRequest
8 голосов
/ 24 января 2011

Как скопировать DbCommand параметры в другой DbCommand, я хочу новый DbCommand с теми же параметрами, что и мои последние DbCommand.Но теперь с другой строкой SQL.

Ответы [ 5 ]

3 голосов
/ 24 января 2011

не могли бы вы сделать что-то подобное?

  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());
2 голосов
/ 24 января 2011

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

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;
}
1 голос
/ 06 ноября 2014
// 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);
1 голос
/ 24 января 2011

Если все, что вам нужно, это коллекция 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);
            }
        }
    }   
0 голосов
/ 17 июля 2018

Простой способ в vb.net

p - входящий sqlparameter:

Dim p1 As SqlClient.SqlParameter = CType(CType(p, ICloneable).Clone, SqlClient.SqlParameter)
...