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
相关产品推荐
相关产品推荐

