2011-01-24 7 views

Trả lời

2

Bạn thể đặt mã bạn cần phải tái sử dụng trong một phương pháp riêng biệt:

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

là có cách nào khác. Nếu tôi làm điều này, tôi sẽ phải tạo ra một hàm cho mọi thông số tái chế mà tôi có. –

+0

Chuyển những thông số đó làm thông số. (Xem câu trả lời cập nhật của tôi) –

+0

cách có thể tạo một phiên bản DBCommand mới? Nguyên mẫu phương thức nên có các tham số DBCommand AddParameters công khai (các tham số DBCommand dbCommand, DBParameterCollection); bây giờ người gọi có thể vượt qua bất kỳ loại nào xuất phát từ DBCommand cho tham số đầu tiên và cho loại param thứ hai xuất phát từ DBParameterCollection. ví dụ: AddParams (sqlCommand, sqlParameterCollection) –

1

Nếu tất cả các bạn đang theo đuổi là bộ sưu tập parms, bạn có thể thử một phương pháp helper mà tạo ra một bản sao sâu của bộ sưu tập .parameters trên lệnh của bạn. Xem nếu điều này sẽ nhổ ra những gì bạn đang tìm kiếm.

Tôi không thể nhận tín dụng cho phương pháp ObjectCopier, nó chỉ là một phương thức lớp cơ sở hữu ích mà tôi nhận được từ một dự án trước đây.

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

bạn có thể làm điều gì đó như thế này không?

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

Điều này sẽ không hoạt động vì bạn không thể thêm các tham số từ một lệnh này sang lệnh khác, 'Add' sẽ nhận ra nó và ném một' ArgumentException'. https://msdn.microsoft.com/en-us/library/ht4eset1(v=vs.110).aspx 'Cast' +' ToArray' sẽ thay đổi bộ sưu tập không phải là tham số, chúng vẫn là cùng một thể hiện. –

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