stringbuilder对mysql查询执行空检查

b0zn9rqh  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(372)

我有一个非静态类,它包含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#,所以很抱歉的新手问题!

xmjla07d

xmjla07d1#

参数化查询可以帮助您避免sql注入,但使用它们并不仅仅是为了这个目的。它们可以帮助您编写更好的代码(没有缺少引号或将值中的现有引号加倍,没有小数和双精度的解析问题)和更可读的代码。
请注意,如果要插入null值,请使用dbnull.value。

string query = @"INSERT INTO `dbname`.`tablename` 
                (`OrderID`, `Code`, `Supplier`, `Unit`, `From`, `To`, 
                 `StockType`, `ItemsOrdered`, `QtyNewItems`, `PerNewItems`, 
                 `ArrivedDate`, `CompletedDate`, `Notes`, `OrderDate`) 
                 VALUES 
                 (@OrderID, @Code, @Supplier, @Unit, @From, @To, 
                  @StockType, @ItemsOrdered, @QtyNewItems, @PerNewItems, 
                  @ArrivedDate, @CompletedDate, @Notes, @OrderDate)";

MySqlCommand cmd = new MySqlCommand(query, connection);
cmd.Parameters.Add("@OrderID", MySqlDbType.Int32).Value = orderID;
cmd.Parameters.Add("@Code", MySqlDbType.VarChar).Value = (string.IsNullOrEmpty(Code) ? DBNull.Value : (object)code) ;

---- and so on for all other parameters, no need to convert them to strings -----

但是,如果您主要关心的是代码的简单性(即越少越好),那么您可能应该看看隐藏ado.net所有样板代码的某种orm。例如,使用免费的ormdapper(一个轻量级的orm库),您可以简单地编写

MyOrderClass orderInstance = this;

using(IDbConnection cnn = GetYourOpenConnectionFromThisMethod())
{
     string query = " --- as above --- ";
     int result = cnn.Execute(query, orderInstance);

}

这里唯一需要注意的是,myorderclass属性应该与数据库字段同名。

相关问题