我有一个非静态类,它包含14个可公开访问的属性。该类还将有三个方法使用类示例中的值返回update、insert和delete mysql查询(作为字符串)。有些属性是可以为空的,所以我需要在创建mysql查询之前检查一下。
目前,我是这样做的:
public string GetNewString()
{
StringBuilder sb = new StringBuilder("INSERT INTO `dbname`.`tablename` (`OrderID`, `Code`, `Supplier`, `Unit`, `From`, `To`, `StockType`, `ItemsOrdered`, `QtyNewItems`, `PerNewItems`, `ArrivedDate`, `CompletedDate`, `Notes`, `OrderDate`) VALUES (");
//PK & not nullable, so no check
sb.Append($"'{this.OrderID}', ");
if (this.Code.ToString().Length.Equals(0))
{
sb.Append("NULL, ");
}
else
{
sb.Append($"'{this.Code}', ");
}
if (this.Supplier.ToString().Length.Equals(0))
{
sb.Append("NULL, ");
}
else
{
sb.Append($"'{this.Supplier}', ");
}
我的问题是,有没有一种更简单的方法可以做到这一点,而不必为每个属性使用if/else循环?我试过使用三元运算符,但不太喜欢。我现在这样做没有什么不对(至少从我所看到的情况来看),除了膨胀了方法。
另外,我不是最好的或最有经验的c#,所以很抱歉的新手问题!
1条答案
按热度按时间xmjla07d1#
参数化查询可以帮助您避免sql注入,但使用它们并不仅仅是为了这个目的。它们可以帮助您编写更好的代码(没有缺少引号或将值中的现有引号加倍,没有小数和双精度的解析问题)和更可读的代码。
请注意,如果要插入null值,请使用dbnull.value。
但是,如果您主要关心的是代码的简单性(即越少越好),那么您可能应该看看隐藏ado.net所有样板代码的某种orm。例如,使用免费的ormdapper(一个轻量级的orm库),您可以简单地编写
这里唯一需要注意的是,myorderclass属性应该与数据库字段同名。