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);
至此问题解决。记录以作参考

浙公网安备 33010602011771号