реляционное сопоставление объектов - вставка хранимых процедур обновления - PullRequest
2 голосов
/ 22 октября 2011

Я пытаюсь изучить реляционное сопоставление объектов и создал свой собственный метод, который принимает объект и сопоставляет имена столбцов с соответствующими свойствами объекта.

Я хотел бы сделать то же самое при вставке простоуказание хранимой процедуры и сопоставление имен свойств объекта с именами соответствующих столбцов.Но я не уверен, как я могу это сделать или если это вообще возможно?Кто-нибудь знает какие-нибудь хорошие учебники по реляционному отображению объектов на c #.

Я предоставил своего читателя ниже, который заполняет список.

Я просто делаю это для развлечения, поэтому я не хочу использовать какие-либо фреймворки ORM.

public static List<T> loadFromReader(string sProcName)
{
    List<T> EntityCollection = new List<T>();            
    Type type = typeof(T);
    PropertyInfo[] properties = typeof(T).GetProperties();

    using (Connection)
    {
        SqlCommand command = new SqlCommand(sProcName);
        command.CommandType = CommandType.StoredProcedure;

        if (SqlParamterList != null && SqlParamterList.Count > 0)
        {
            foreach (SqlParameter parameter in SqlParamterList)
                command.Parameters.Add(parameter);
        }

        using (SqlDataReader reader = command.ExecuteReader())
        {
            int columnCount = reader.FieldCount;
            string[] columnName = new string[columnCount];

            for (int i = 0; i <= columnCount - 1; i++)
                columnName[i] = reader.GetName(i);

            while (reader.Read())
            {
                object obj = Activator.CreateInstance(type);
                for (int i = 0; i <= columnName.Length - 1; i++)
                {
                    foreach (PropertyInfo property in properties)
                    {
                        if (property.Name.Contains(columnName[i]))
                        {
                            object value = reader[i];
                            if (value == DBNull.Value)
                                value = null;

                            type.GetProperty(property.Name).SetValue(obj, value, null);
                        }
                    }
                }
                EntityCollection.Add((T)obj);
            }                
        }                

        clearParameters();
        return EntityCollection;
    }
}

Ответы [ 2 ]

1 голос
/ 22 октября 2011

Не совсем понятно, с какой проблемой вы сталкиваетесь, но вот несколько указателей:

  1. Вы можете увидеть пример того, как получить информацию о параметрах хранимой процедуры Для этого требуется, чтобы хранимая процедура соответствовала ее параметрам.

  2. Если вы хотите, вы можете создать более гибкую систему, сохраняя данные в формате XML в базе данных . таким образом, вам не нужно отображать сущности на хранимые процедуры и / или таблицы.

0 голосов
/ 24 октября 2011

Благодаря ссылкам, указанным в помеченном ответе, я смог сопоставить свойства объектов с параметрами хранимых процедур, которые имеют одинаковые имена. Я предоставил код ниже.

public static void insertObjectMapper(string sProcName, List<T> entities)
        {
            Type type = typeof(T);
            PropertyInfo[] properties = typeof(T).GetProperties();
            string[] paramNames = null;

            using (SqlCommand command = new SqlCommand(sProcName, Connection))
            {
                command.CommandType = CommandType.StoredProcedure;    
                SqlCommandBuilder.DeriveParameters(command);

                if (command.Parameters != null || command.Parameters.Count > 0)
                {
                    clearParameters();
                    foreach (SqlParameter parameter in command.Parameters)
                        addParameter(parameter.ParameterName, parameter.SqlDbType, parameter.Direction, parameter.Value);

                    paramNames = new string[SqlParamterList.Count];
                    int count = 0;

                    foreach (SqlParameter parameter in SqlParamterList)
                    {                        
                        paramNames[count] = parameter.ParameterName.Substring(1);
                        ++count;
                    }

                    foreach (T entity in entities)
                    {
                        for (int i = 0; i <= paramNames.Length - 1; i++)
                        {
                            foreach (PropertyInfo property in properties)
                            {
                                if (property.Name.Contains(paramNames[i]))
                                {
                                    foreach (SqlParameter parameter in SqlParamterList)
                                    {
                                        if (parameter.ParameterName.Substring(1).Contains(paramNames[i]))
                                        {
                                            parameter.Value = entity.GetType().GetProperty(paramNames[i]).GetValue(entity, null);
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                        command.Parameters.Clear();
                        foreach (SqlParameter parameter in SqlParamterList)
                            command.Parameters.Add(parameter);

                        command.ExecuteNonQuery();
                    }
                }        
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...