【发布时间】:2011-01-24 04:53:39
【问题描述】:
如何将DbCommand 参数复制到另一个DbCommand,我想要一个新的DbCommand,其参数与我上一个DbCommand 的参数相同。但现在使用不同的 sql 字符串。
【问题讨论】:
标签: c# .net enterprise-library dbcommand input-parameters
如何将DbCommand 参数复制到另一个DbCommand,我想要一个新的DbCommand,其参数与我上一个DbCommand 的参数相同。但现在使用不同的 sql 字符串。
【问题讨论】:
标签: c# .net enterprise-library dbcommand input-parameters
// 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());
【讨论】:
Add 会识别它并抛出ArgumentException。 msdn.microsoft.com/en-us/library/ht4eset1(v=vs.110).aspx Cast+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;
}
}
【讨论】: