我一直在尝试为c#上的postgresql修改sql命令。注释引号中的这一行是可行的,但是我需要将集合从预定义更改为变量。虽然之后 使用相同的方式将其定义为变量,并且用户以另一种形式给出了文本,它似乎不起作用。用变量替换“ first_name”的正确方法是什么?
id
答案 0 :(得分:0)
上面的代码示例有一些问题,应阻止其工作。这让我对代码行的注释感到震惊。
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的方法有很多,但是它们增加了看起来很简单的复杂性。