2013-04-09 10 views
0

Я хотел бы передать свойства poco в хранимую процедуру (обновить и добавить объект) С более ранними версиями Enterprise Library (например, v2.0) я могу сделать что-то вроде этого :Как обновить poco с помощью Enterprise-библиотеки 5.0

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 теряется.

Вопрос: как я могу получить хранимые-proc-Parameters и заполнить их значениями poco-properties?

ответ

0

Вы можете сделать что-то вроде этого:

Database db = DatabaseFactory.CreateDatabase(); 

string spName = "MySP"; 
var parameters = new object[] { "Information", 22 }; 

int value = (int)db.ExecuteScalar(spName, parameters); 

Теперь это зависит от порядка параметров. Если вы хотите использовать имена и автоматического заполнения DbCommand и ваша база данных поддерживает обнаружение параметров (например, SQL Server), то вы могли бы сделать что-то вроде:

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 являются такими же, как имена параметров хранимой процедуры.

 Смежные вопросы

  • Нет связанных вопросов^_^