You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 查询SQLite数据库无法获取float/string等强类型返回值问题

核心错误原因

  • 你返回SQLiteDataReader前就关闭了数据库连接:SQLiteDataReader是流式读取对象,必须依赖活跃的数据库连接才能读取数据,连接关闭后Reader就失效了,所以访问字段时报行不存在的错误。
  • 变量作用域错误:你在try代码块内定义的SQLiteDataReader r,作用域仅在try块内,方法末尾的return r本身就无法通过编译。
  • 单值查询用错了API:仅查询单个字段的单条结果时,不需要用ExecuteReader,直接用ExecuteScalar方法就能直接拿到目标值。

修复后的实现代码

using System;
using System.Data.SQLite;

namespace Cryptomoney
{
    class DataClass
    {
        private SQLiteConnection sqlite;

        public DataClass()
        {
            sqlite = new SQLiteConnection("Data Source= DataCrypto.sqlite3;Version=3;New=False;");
        }

        // 新增:查询单值的方法,直接返回object类型结果,后续自行转换为对应类型
        public object SelectSingleValue(string query)
        {
            try
            {
                sqlite.Open();
                using SQLiteCommand sqlComm = sqlite.CreateCommand();
                sqlComm.CommandText = query;
                return sqlComm.ExecuteScalar();
            }
            catch (SQLiteException ex)
            {
                Console.WriteLine(ex);
                return null;
            }
            finally
            {
                // 确保不管是否报错都关闭连接
                if (sqlite.State == System.Data.ConnectionState.Open)
                {
                    sqlite.Close();
                }
            }
        }

        // 如果需要查询多行多列,可以用这个方法返回DataTable,连接关闭后也可以正常读取
        public System.Data.DataTable SelectQuery(string query)
        {
            try
            {
                sqlite.Open();
                using SQLiteCommand sqlComm = sqlite.CreateCommand();
                sqlComm.CommandText = query;
                using SQLiteDataAdapter adapter = new SQLiteDataAdapter(sqlComm);
                System.Data.DataTable dt = new System.Data.DataTable();
                adapter.Fill(dt);
                return dt;
            }
            catch (SQLiteException ex)
            {
                Console.WriteLine(ex);
                return null;
            }
            finally
            {
                if (sqlite.State == System.Data.ConnectionState.Open)
                {
                    sqlite.Close();
                }
            }
        }

        // 优化后的非查询操作方法,保证连接正常关闭
        public void ExecuteNonQuery(string query)
        {
            try
            {
                sqlite.Open();
                using SQLiteCommand cmd = sqlite.CreateCommand();
                cmd.CommandText = query;
                cmd.ExecuteNonQuery();
            }
            catch (SQLiteException ex)
            {
                Console.WriteLine(ex);
            }
            finally
            {
                if (sqlite.State == System.Data.ConnectionState.Open)
                {
                    sqlite.Close();
                }
            }
        }
    }
}

调用示例

1. 获取float类型值

var result = dataClass.SelectSingleValue("SELECT PercChange1h FROM DataCrypt WHERE ID = 1");
// 先判断是否为空,避免数据库字段为null时报转换错误
if (result != null && result != DBNull.Value)
{
    float b = Convert.ToSingle(result);
    // 后续直接使用b即可
}

2. 获取string类型值

var result = dataClass.SelectSingleValue("SELECT 字段名 FROM 表名 WHERE 条件");
if (result != null && result != DBNull.Value)
{
    string str = result.ToString();
}

3. 获取int类型值

var result = dataClass.SelectSingleValue("SELECT 字段名 FROM 表名 WHERE 条件");
if (result != null && result != DBNull.Value)
{
    int num = Convert.ToInt32(result);
}

4. 多行多列查询的用法

var dt = dataClass.SelectQuery("SELECT * FROM DataCrypt");
if (dt != null && dt.Rows.Count > 0)
{
    // 读取第一行的PercChange1h字段
    float b = Convert.ToSingle(dt.Rows[0]["PercChange1h"]);
    // 遍历所有行
    foreach (System.Data.DataRow row in dt.Rows)
    {
        float val = Convert.ToSingle(row["PercChange1h"]);
        // 处理每一行数据
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:36:02