Как изменить установленное значение команды обновления npgsql postgresql c # - PullRequest
0 голосов
/ 20 сентября 2018

Я пытался изменить команду sql для postgresql на c #.Строка в кавычках комментария работает, но мне нужно изменить набор с предопределенного на переменный.Хотя после использования того же способа определения его как переменной с текстом, заданным пользователем в другой форме, похоже, он не работает.Какой правильный способ заменить «first_name» на переменную?

   String oldname = Actor.oldname;
String newname = Actor.newname;
String column = Actor.columnname;

try
    {
        string connstring = "Server=127.0.0.1; Port=5432; User Id=postgres; Password=72677267; Database=imdb;";

        NpgsqlConnection connection = new NpgsqlConnection(connstring);

        connection.Open();

        //NpgsqlCommand command = new NpgsqlCommand("UPDATE actor SET first_name = " + newname + " WHERE first_name =" + oldname + "", connection);

        NpgsqlCommand command = new NpgsqlCommand("UPDATE actor SET " + column + " = " + newname + " WHERE " + column + " =" + oldname + "", connection);

        NpgsqlDataReader dataReader = command.ExecuteReader();

        connection.Close();

         return dataItems;
    }
catch (Exception msg)
    {
        MessageBox.Show(msg.ToString());
        throw;
    }

1 Ответ

0 голосов
/ 21 сентября 2018

У вас есть несколько проблем с приведенным выше примером кода, которые должны помешать его работе.Я немного шокирован тем, что закомментированная строка кода работает.

  1. Вы не цитируете значения, которые вы обновляете
  2. Даже если вы их цитировали, вам следует вместо этого использовать параметры.
  3. Устройство чтения данных предназначено для чтения.Если вы выполняете DML, вы должны использовать ExecuteNonQuery.Если у вас есть возвращаемые значения, может быть причина для чтения данных, но в этом случае вам это не нужно.

Все это говорит о том, что динамический SQL иногда неизбежен, но я быРекомендовать все возможные способы, прежде чем сдаться и сделать динамический SQL.Если вам необходимо, одним из способов смягчения этого может быть конечное количество параметров, поэтому вместо того, чтобы позволить им обновлять ЛЮБОЕ поле, пусть они выбирают поле из списка параметров.

Это все еще динамичноSQL, но он по крайней мере параметризован, и возможности внедрения по крайней мере ограничены методом, который делает маловероятным любое внедрение.

public enum ActorField
{
    FirstName,
    LastName,
    Salutation
}

public void UpdateActorField(string OldName, string NewName, ActorField FieldId)
{
    string sql = "update actor set {0} = :NEW_NAME where {0} = :OLD_NAME";

    switch (FieldId)
    {
        case ActorField.FirstName
            sql = string.Format(sql, "first_name");
            break;
        case ActorField.LastName
            sql = string.Format(sql, "last_name");
            break;
        case ActorField.Salutation
            sql = string.Format(sql, "salutation");
            break;
    }

    using (NpgsqlCommand cmd = new NpgsqlCommand(sql, connection))
    {
        cmd.Parameters.AddWithValue("NEW_NAME", NewName);
        cmd.Parameters.AddWithValue("OLD_NAME", OldName);

        int updatedRows = cmd.ExecuteNonQuery();
    }
}

Существуют более ловкие способы сделать это с помощью одного оператора SQL и с помощьюнет динамического SQL, но они добавляют большую сложность к тому, что должно быть простой проблемой.

...