将参数从DbCommand复制到另一个DbCommand

时间:2011-01-24 04:53:40

标签: c# .net enterprise-library dbcommand input-parameters

如何将DbCommand个参数复制到另一个DbCommand,我想要一个新的DbCommand,其参数与我上次的DbCommand相同。但现在使用不同的sql字符串。

6 个答案:

答案 0 :(得分: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());

答案 1 :(得分: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;
}

答案 2 :(得分: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 :(得分: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);

答案 4 :(得分:0)

vb.net中的一种简单方法

p是传入的sql参数:

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

答案 5 :(得分:0)

array