如何修改更新命令npgsql postgresql C#的设置值

时间:2018-09-20 12:26:22

标签: c# postgresql sql-update npgsql

我一直在尝试为c#上的postgresql修改sql命令。注释引号中的这一行是可行的,但是我需要将集合从预定义更改为变量。虽然之后 使用相同的方式将其定义为变量,并且用户以另一种形式给出了文本,它似乎不起作用。用变量替换“ first_name”的正确方法是什么?

id

1 个答案:

答案 0 :(得分:0)

上面的代码示例有一些问题,应阻止其工作。这让我对代码行的注释感到震惊。

  1. 您未引用您更新的值
  2. 即使引用了它们,也应该使用参数。
  3. 数据读取器用于读取。如果要执行DML,则应使用ExecuteNonQuery。如果您有返回值,则可能是因为有一个数据读取器,但在这种情况下,您似乎并不需要它。

总而言之,动态SQL有时是不可避免的,但是我建议在放弃并制作动态SQL之前应尽一切可能。如果需要的话,减轻这种情况的一种方法可能是拥有有限数量的选项,因此,与其让他们更新ANY字段,不如让他们从选项列表中选择一个字段。

这仍然是动态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的方法有很多,但是它们增加了看起来很简单的复杂性。