You need to enable JavaScript to run this app. C#如何正确读取SQLite数据库REAL类型值并转为double或float
优惠活动
大模型
产品
解决方案
定价
更多

C#如何正确读取SQLite数据库REAL类型值并转为double或float

问题根因

你遇到的问题本质是两个常见的SQLite数值读取坑:

  • SQLite是动态类型系统,即便你声明列类型是REAL,实际写入时也可能存储为TEXT格式,如果写入时用了逗号作为小数点的区域格式,读取时默认用小数点(.)作为分隔符的转换逻辑会把逗号识别为千位分隔符,直接截断小数部分
  • 部分版本的System.Data.SQLite驱动对REAL类型的直接GetDouble映射存在兼容问题,会报specified cast is not valid错误

解决方法

第一步 先确认列实际存储格式

先执行下面的SQL查询确认存储类型和值:

SELECT typeof(KDRatio), KDRatio FROM doubles LIMIT 1

对应解决方案

如果查询显示typeof结果为TEXT,值是带逗号的格式(如1,99)

通过字符串替换+指定不变区域转换的方式读取:

using System.Globalization;

// 读取逻辑替换为下面的代码
string kdRatioStr = sqlReader["KDRatio"].ToString().Replace(',', '.');
double nbr = Convert.ToDouble(kdRatioStr, CultureInfo.InvariantCulture);

如果查询显示typeof结果为REAL

优先通过decimal中转避免直接转换报错:

int kdIndex = sqlReader.GetOrdinal("KDRatio");
double nbr = Convert.ToDouble(sqlReader.GetDecimal(kdIndex));

额外优化建议

你的数据库连接、命令、DataReader都建议用using块包裹,会自动释放资源,不需要手动调用Close(),避免异常场景下资源泄漏:

public static void GetDouble()
{
    using (SQLiteConnection databaseConnection = new SQLiteConnection($"Data Source=.\\val.sqlite;Version=3;"))
    using (SQLiteCommand sqlCommand = databaseConnection.CreateCommand())
    {
        sqlCommand.CommandText = "SELECT KDRatio FROM doubles"; // 不要用SELECT *,按需取列更高效
        databaseConnection.Open();
        using (SQLiteDataReader sqlReader = sqlCommand.ExecuteReader())
        {
            while (sqlReader.Read())
            {
                string kdRatioStr = sqlReader["KDRatio"].ToString().Replace(',', '.');
                double nbr = Convert.ToDouble(kdRatioStr, CultureInfo.InvariantCulture);
                Console.WriteLine(nbr);
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Eddd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 21:27:03