2011-01-24 18 views

Odpowiedz

2

Ty mógłby umieścić kod potrzebny do ponownego wykorzystania w odrębnym sposobem:

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

jest jakiś inny sposób. Gdybym to zrobił, musiałbym stworzyć funkcję dla każdego odzyskanego przeze mnie parametru. –

+0

Przekaż te parametry również jako parametry. (Zobacz moją zaktualizowaną odpowiedź) –

+0

w jaki sposób można utworzyć nowe wystąpienie polecenia DBCommand? Prototyp metody powinien być publicznym DBCommand AddParameters (DBCommand dbCommand, DBParameterCollection parameters); teraz wywołujący może przekazać dowolny typ, który wywodzi się z DBCommand dla pierwszego parametru i dla drugiego typu parametru, który wywodzi się z DBParameterCollection. np: AddParams (sqlCommand, sqlParameterCollection) –

1

Jeśli wszystko to po to zbiór param, można spróbować metody pomocnika, który tworzy głęboką kopię kolekcji .parameters na twoje polecenie. Sprawdź, czy to wypluje to, czego szukasz.

Nie mogę wziąć kredytu za metodę ObjectCopier, to tylko przydatna metoda klasy bazowej, którą otrzymałem z poprzedniego projektu.

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

Czy możesz zrobić coś takiego?

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

To nie zadziała, ponieważ nie można dodawać parametrów z jednego polecenia do drugiego, 'Dodaj' rozpozna je i rzuci" ArgumentException ". https://msdn.microsoft.com/en-us/library/ht4eset1(v=vs.110).aspx "Cast" + "ToArray" zmieni kolekcję, a nie parametry, są to wciąż te same instancje. –

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); 
Powiązane problemy