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

C# WPF登录开发:如何将SQLite查询结果存入变量

解决方案:直接通过SQLiteDataReader读取字段到变量

你可以直接利用SQLiteDataReader的列名或索引读取不同类型的数据,无需额外定义实体类或拆分查询,这是最直接高效的方式。以下是完善后的代码:

Database databaseObject = new Database();
var userid = LoginTextBox.Text;
// 建议明确指定需要的列,避免表结构变更带来的问题,比SELECT *更安全
string query = "SELECT UserId, Username, Email, Age, CreateTime FROM users WHERE userid = @userid";
SQLiteCommand myCommand = new SQLiteCommand(query, databaseObject.myConnection);
databaseObject.OpenConnection();
myCommand.Parameters.AddWithValue("@userid", userid);
SQLiteDataReader result = myCommand.ExecuteReader();
if (result.HasRows)
{
    // 读取第一条结果(按userid查询应仅有一条)
    result.Read();
    
    // 按列名读取不同类型数据,处理可能的DBNull情况
    int userId = result.IsDBNull(result.GetOrdinal("UserId")) ? 0 : result.GetInt32(result.GetOrdinal("UserId"));
    string username = result.IsDBNull(result.GetOrdinal("Username")) ? string.Empty : result.GetString(result.GetOrdinal("Username"));
    string email = result.IsDBNull(result.GetOrdinal("Email")) ? string.Empty : result.GetString(result.GetOrdinal("Email"));
    int age = result.IsDBNull(result.GetOrdinal("Age")) ? 0 : result.GetInt32(result.GetOrdinal("Age"));
    DateTime createTime = result.IsDBNull(result.GetOrdinal("CreateTime")) ? DateTime.MinValue : result.GetDateTime(result.GetOrdinal("CreateTime"));
    
    // 此处可直接使用这些变量完成后续业务逻辑,比如存入全局变量或传递至其他模块
}
else
{
    LoginTextBox.Text = "";
}
databaseObject.CloseConection();

关键说明:

  • **避免使用SELECT ***:明确指定需要的列,后续表结构新增字段时不会影响当前查询的字段顺序和类型,减少潜在bug。
  • DBNull处理:数据库允许为空的字段必须判断是否为DBNull,否则直接调用GetXXX方法会抛出异常。
  • 列名/索引选择:用列名更直观易维护,用索引(如result.GetInt32(0))性能略高但可读性差,可根据场景选择。

如果觉得每次写DBNull判断麻烦,可以封装一个简单的扩展方法简化代码:

public static class SQLiteDataReaderExtensions
{
    public static T GetValueOrDefault<T>(this SQLiteDataReader reader, string columnName, T defaultValue = default)
    {
        int ordinal = reader.GetOrdinal(columnName);
        return reader.IsDBNull(ordinal) ? defaultValue : (T)reader.GetValue(ordinal);
    }
}

使用扩展方法后,读取代码会更简洁:

int userId = result.GetValueOrDefault<int>("UserId");
string username = result.GetValueOrDefault<string>("Username");
DateTime createTime = result.GetValueOrDefault<DateTime>("CreateTime", DateTime.Now);

这种方式既不需要定义实体类,也不需要拆分多个查询,兼顾了效率和可读性,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:01:02