naw*_*fal 3 c# ado.net interface mysql-connector parameterization
在我们拥有的每个ADO.NET连接器上AddWithValue,因此添加参数是轻而易举的.令我感到惊讶的是,这种过载是不可用的,IDataParameterCollection甚至是不可用的DbParameterCollection.在编写独立于供应商的层(针对接口编码)时,如何以最小的麻烦(来自调用方和被调用方)实现相同的目标?
现在我做:
public void Execute(string query, Action<IDbCommand> parameterizer)
Execute(query, cmd =>
{
var param = cmd.CreateParameter();
param.ParameterName = "user_id";
param.Value = 1;
cmd.Parameters.Add(param);
param = cmd.CreateParameter();
param.ParameterName = "mf";
param.Value = "6CE71037";
cmd.Parameters.Add(param);
});
Run Code Online (Sandbox Code Playgroud)
那是太多的工作不是吗.否则我可以更改签名:
public void Execute(string query, IEnumerable<KeyValuePair<string, object>> parameters)
var parameters = new Dictionary<string, object>
{ { "user_id", 1 }, { "mf", "6CE71037" } };
Execute(query, parameters);
Run Code Online (Sandbox Code Playgroud)
这种方法要求我在被调用者(Execute方法)中编写另一个循环.这几乎是我想要的,但只是看看是否有更简洁的方法.比如这样:
public void Execute(string query, Action<IDataParameterCollection> parameterizer)
Execute(query, p =>
{
p["user_id"] = 1;
p["mf"] = "6CE71037";
});
Run Code Online (Sandbox Code Playgroud)
这给出了运行时异常Unable to cast object of type 'System.Int32' to type 'System.Data.Common.DbParameter.我理解错误.只是想知道是否有更优雅的模式..
为什么不在上次签名中使用字典:
public void Execute(string query, Action<Dictionary<string, object>> parameterizer)
Execute(query, p =>
{
p["user_id"] = 1;
p["mf"] = "6CE71037";
});
Run Code Online (Sandbox Code Playgroud)
然后,该Execute方法可以使用Action填充a Dictionary并基于它创建参数:
var parameters = new Dictionary<string, object>();
parametrizer(parameters);
foreach (var pair in parameters)
{
var parameter = f.CreateParameter();
parameter.ParameterName = pair.Key;
parameter.Value = pair.Value;
cmd.Parameters.Add(parameter);
}
Run Code Online (Sandbox Code Playgroud)
如果你想传递实际的另一个解决方案IDbCommand是使用扩展方法:
public static void AddWithValue<T>(this IDbCommand command, string name, T value)
{
var parameter = command.CreateParameter();
parameter.ParameterName = name;
parameter.Value = value;
command.Parameters.Add(parameter);
}
Run Code Online (Sandbox Code Playgroud)
调用它看起来像:
Execute(query, cmd =>
{
cmd.AddWithValue("user_id", 1);
cmd.AddWithValue("mf", "6CE71037");
});
Run Code Online (Sandbox Code Playgroud)