簡體   English   中英

將參數從 DbCommand 復制到另一個 DbCommand

[英]Copy parameters from DbCommand to another DbCommand

你如何將DbCommand參數復制到另一個DbCommand ,我想要一個新的DbCommand ,它的參數與我上一個DbCommand參數相同。 但是現在有了不同的 sql 字符串。

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

可以將需要重用的代碼放在單獨的方法中:

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

你能做這樣的事情嗎?

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

如果您所追求的只是 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);
            }
        }
    }   

vb.net 中的一個簡單方法

p 是傳入的 sql 參數:

Dim p1 As SqlClient.SqlParameter = CType(CType(p, ICloneable).Clone, SqlClient.SqlParameter)
private List<Tuple<string, SqlDbType, string>> where_param;
public IEnumerable<SqlParameter> RecycledParameters(){
  foreach(Tuple<string, SqlDbType, string> tuple in where_param) {
    SqlParameter local_arg = new SqlParameter(tuple.Item1, tuple.Item2);
    local_arg.Value = tuple.Item3;
    yield return local_arg;
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM