SQLite的ROUND函数的坑和解决方案

今天使用sqlite的round函数对数据进行四舍五入处理,但遇到了以下问题,如图所示:

 

为什么结果不一样,不得而知,但我找到了解决方案,同大家分享一下。

首先在c#中创建自定义函数

[SQLiteFunction(Name = "RoundAccounting", Arguments = 2, FuncType = FunctionType.Scalar)]
public class RoundAccounting : SQLiteFunction
{
    public override object Invoke(object[] args)
    {
        decimal value = 0;
        int decimalPlaces = 0;

        if(decimal.TryParse(args[0].ToString(), out value) && int.TryParse(args[1].ToString(), out decimalPlaces))
            return Math.Round(value, decimalPlaces, MidpointRounding.AwayFromZero);

        return 0;
    }
}

然后在数据层上我们将函数绑定到查询方法里,关键代码为红色:

public static DataSet Query(string sql)
{
	DataSet dsResult = null;
	using (SQLiteConnection conn = getSQLiteConnection())
	{
	try
		{
		var function = new RoundAccounting();
		var attributes = function.GetType().GetCustomAttributes(typeof(SQLiteFunctionAttribute), true).Cast<SQLiteFunctionAttribute>().ToArray();
		conn.Open();
		conn.BindFunction(attributes[0], function);
		SQLiteDataAdapter da = new SQLiteDataAdapter(sql, conn);
          dsResult = new DataSet();
         da.Fill(dsResult, "ds");
    } catch (Exception ex) {
          throw new Exception("执行查询异常:" + ex.Message);
    }
  }
  return dsResult;
}
SQL查询代码为:SELECT RoundAccounting(列名, 2);
 
至此问题解决。

记录以作参考
posted @ 2023-03-03 15:19  俏俏俏大人丶  阅读(164)  评论(0)    收藏  举报