Как вы скопировать DbCommand
параметры другой DbCommand
, я хочу новую DbCommand
с теми же параметрами, как мой последний DbCommand
. Но теперь с другой строкой sql.Копирование параметров с DbCommand на другой DbCommand
ответ
Вы могли поставить код, который нужно повторно использовать в отдельный метод:
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;
}
Если все вы после это коллекция 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);
}
}
}
Вы могли бы сделать что-то вроде этого?
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());
Это не сработает, потому что вы не можете добавлять параметры из одной команды в другую, 'Add' распознает ее и выдает' ArgumentException'. https://msdn.microsoft.com/en-us/library/ht4eset1(v=vs.110).aspx 'Cast' +' ToArray' изменяет коллекцию, а не параметры, они все равно являются теми же экземплярами. –
// 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);
есть ли другой способ. Если бы я сделал это, мне пришлось бы создать функцию для каждого переработанного параметра, который у меня есть. –
Передайте их как параметры. (См. Мой обновленный ответ) –
Как создать новый экземпляр DBCommand? Прототип метода должен быть общедоступным DBCommand AddParameters (параметры DBCommand dbCommand, DBParameterCollection); теперь вызывающий может передать любой тип, который выводится из DBCommand для первого параметра и для второго типа param, который происходит из DBParameterCollection. ex: AddParams (sqlCommand, sqlParameterCollection) –