проблема в подготовке, где предложение метода обновления в c # - PullRequest
2 голосов
/ 02 мая 2011

Эй, ребята, я нахожу немного трудным подготовить предложение where в следующем методе обновления. Я создаю метод обновления, здесь я делаю это правильно?но все еще я сбит с толку тем, как мне узнать, какое свойство использовать в предложении where

или какой-либо лучший подход для создания универсального метода обновления?я буду очень благодарен

РЕДАКТИРОВАТЬ

    public bool UpdateData(object Entity, ref String error)
    {
        Type objectType = Entity.GetType();
        PropertyInfo[] properties = objectType.GetProperties();
        error = "";
        string column = null;
        int i = 0;
        SqlConnection conn = OpenConnection();
        SqlCommand sqlcommand=null;
        foreach (PropertyInfo info in properties)
        {
            if (i == 0)
            {
                i++;
                continue;

            }
            column += (i >= 0 && i < properties.Length - 1) ? string.Format(@"{0}=@{0},", info.Name) : string.Format(@"{0}=@{0}",info.Name);
            i++;
        }
        try
        {
            string sqlQuery = string.Format(@"update {0} set {1} 
            where {2}='{3}'", objectType.Name, column,1,1);//see here m not getting how to prepare this where clause
            sqlcommand = new SqlCommand(sqlQuery, conn);
            i = 0;
            foreach (PropertyInfo info in properties)
            {
                if (i == 0)
                {
                    i++;
                    continue;

                }
                sqlcommand.Parameters.AddWithValue(string.Format("@{0}", info.Name), info.GetValue(Entity, null));
            }
            sqlcommand.ExecuteNonQuery();
            sqlcommand = null;
            return true;
        }
        catch (Exception ex)
        {
            return false;
        }
        finally
        {
            CloseConnection(conn);
        }
    }

РЕДАКТИРОВАТЬ

см. в коде выше есть условие if if (i == 0) in foreach loop я не хочу делать это, потому что здесь я предполагаю, что мои объекты property i.e employee_id находятся на 1-м индексе в массиве PropertyInfo[] .. что если кто-то в этом классе создаст свойства класса, такие как public string employee_name{get,set} public string employee_add{get,set} public string employee_id{get,set}В случае, если foreach loop пропустит employee_name вместо 'employee_id', потому что я использовал if(i=0), я хочу способ пропустить только значение идентификатора, например employee_id в foreach loop in my update function независимо от его индекса в массиве propertyInfo.... я хорошо объяснил?

Ответы [ 2 ]

1 голос
/ 05 мая 2011

Вы можете использовать пользовательский атрибут или интерфейс, чтобы определить свойство, представляющее идентификатор вашей сущности, и использовать его в предложении where. Хотя этот подход имеет отрицательную сторону, вы должны изменить свои классы сущностей (что не всегда возможно). Вот пример:

[PrimaryKey]
public string EmployeeId
{
get;set;
}

или

public class Employee:IEntity
{
public object EntityId
{
get
{
return this.EmployeeId
}
}
}

другим способом может быть сохранение метаданных сущностей где-то еще (например, xml-файл или словарь)

например:

<entities>
<entity type="Employee" primarykey="EmployeeId" />
</entities>

или

Hashtable EntityPrimaryKeys=new Hashtable{(typeof(Employee),"EmployeeId")};
1 голос
/ 02 мая 2011

Вы действительно должны использовать SQLCOmmand.Parameters вместо конкатенации строк в SQL.Таким образом, он будет более читабельным, безопасным и более функциональным.В вашем коде есть классическая эксплойт, где кто-то может отправить параметр, содержащий ';удалить базу данных yourdatabase;выберите * из двойного, где '' = 'или аналогичный.

Поэтому, пожалуйста, обновите свой код, и если у вас возникнет та же проблема, мы увидим, что происходит.

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