如何使用Enterprise-Library 5.0更新poco
问题描述:
我想将poco属性传递给存储过程(更新并添加对象) 对于早期版本的企业库(例如v2.0),我可以这样做:如何使用Enterprise-Library 5.0更新poco
var arrParam = SqlHelperParameterCache.GetSpParameterSet(ConnectionString(),
SprocNameSet);
for (int x = 0; x <= arrParam.Length - 1; x++)
{
System.Reflection.PropertyInfo pi =
dataObject.GetType()
.GetProperty(arrParam[x].ParameterName
.Substring(1, Convert.ToInt32(arrParam[x].ParameterName.Length) - 1));
arrParam[x].Value = pi.GetValue(myDataObject, null);
}
SqlHelper.ExecuteScalar(ConnectionString(),
CommandType.StoredProcedure,
SprocNameSet,
arrParam);
但随着5.0版本(也许更早?)的SqlHelperParameterCache.GetSpParameterSet方法已经一去不复返了。
现在的问题是:如何获取stored-proc参数并使用poco-properties-values填充这些参数?
答
你可以做这样的事情:
Database db = DatabaseFactory.CreateDatabase();
string spName = "MySP";
var parameters = new object[] { "Information", 22 };
int value = (int)db.ExecuteScalar(spName, parameters);
现在,这依赖于参数顺序。如果你想使用的名称和自动填充的DbCommand和你的数据库支持参数发现(如SQL服务器),那么你可以这样做:
public class MyClass
{
public string Severity { get; set; }
public int OtherValue { get; set; }
}
MyClass myClass = new MyClass() { OtherValue = 1, Severity = "Information" };
Database db = DatabaseFactory.CreateDatabase();
string spName = "MySP";
DbCommand cmd = db.GetStoredProcCommand(spName);
db.PopulateCommandValues(cmd, myClass);
int value = (int)db.ExecuteScalar(cmd);
public static class DatabaseExtensions
{
public static void PopulateCommandValues<T>(this Database db,
DbCommand cmd, T poco)
{
if (!db.SupportsParemeterDiscovery)
{
throw new InvalidOperationException("Database does not support parameter discovery");
}
db.DiscoverParameters(cmd);
foreach (DbParameter parameter in cmd.Parameters)
{
if (parameter.Direction != System.Data.ParameterDirection.Output &&
parameter.Direction != System.Data.ParameterDirection.ReturnValue)
{
PropertyInfo pi = poco.GetType().GetProperty(
parameter.ParameterName.Substring(1)); // remove @ from parameter
if (pi != null)
{
parameter.Value = pi.GetValue(poco, null);
}
}
}
}
}
这假定POCO属性名称是相同的存储过程参数名称。