如何使用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属性名称是相同的存储过程参数名称。