【发布时间】:2020-05-13 18:45:00
【问题描述】:
我在 SQLite 中遇到了一个奇怪的问题,这是我执行的步骤:
Git 仓库: https://github.com/moon1234moon/SQLiteApp
步骤:
我在 SQLite 中创建了表 Users 并将其添加到解决方案中的前端项目中
然后我将它包含在项目中并将其属性设置为:
{
"Build Action" => "Content",
"Copy to Output Directory" => "Copy if newer"
}
- 使用这个 c# 代码,我使用不同类中的两个函数将数据插入到用户表中:
第一个功能:
public void Register(UserModel user, string password, bool autoLogin = true)
{
string hashedPassword = Hasher.HashPassword(password);
bool res = AuthDataAccess.SaveNewData("Users", ToListOfKeyValuePairs(user, hashedPassword));
if (res == true && autoLogin == true)
{
Login(user.Username, password);
}
}
第二个功能:
public static dynamic SaveNewData(string tablename, List<KeyValuePair<string, string[]>> data)
{
try
{
using (IDbConnection cnn = new SQLiteConnection(ConnectionString()))
{
string query = queryBuilder.GetSaveDataQuery(tablename, data);
cnn.Execute(query);
return true;
}
}
catch(Exception e)
{
return false;
}
}
这应该会执行这个查询:
INSERT INTO Users(FirstName,LastName,Username,Password,CreatedDate,UpdatedDate) VALUES('Admin','Admin','admin','P2Y+8tZPRGwjcV8tQRDl9m1G2omLW248s5RK81iGnqdMXPh0','1/28/2020 12:45:07 PM','1/28/2020 12:45:07 PM');
- 之后我尝试从 c# 执行以下查询:
SELECT * FROM Users WHERE Username = 'admin'
使用此功能:
public static bool CheckIfUsernameExist(string username)
{
try
{
using (IDbConnection cnn = new SQLiteConnection(ConnectionString()))
{
string query = queryBuilder.GetByUsername(username);
var user = cnn.Query<UserModel>(query, new DynamicParameters()).ToList();
if(user.Count > 0)
{
return true;
}
return false;
}
}
catch
{
return false;
}
}
问题来了
但结果与我从 DB Browser for SQLite 得到的结果相矛盾:
- 在 DB 浏览器中,我得到了一个空的用户表
- 在 C# 中,我得到: 用户变量:
{
user:
{
Count: 1 System.Collections.Generic.List<DataAccess.Authentication.Models.UserModel>,
[0]: DataAccess.Authentication.Models.UserModel} DataAccess.Authentication.Models.UserModel
{
CreatedDate {1/28/2020 12:05:56 PM} System.DateTime
FirstName "Admin" string
Id 1 int
LastName "Admin" string
Password "32EgQocI8Oinbm3k4ZszPNXiHDE8ZpA+FJemCoevr8dTkKVT" string
UpdatedDate {1/28/2020 12:05:56 PM} System.DateTime
Username "admin" string
}
}
}
为什么不一样??? ...
经过一些测试,结果是:
- C# 正在将数据保存在
/bin/debug目录中 - 当 DB Browser 从项目目录中获取时
问题是它们不同步..我们如何解决这个问题???
【问题讨论】:
-
请帮忙!!如果有人需要检查,我添加了整个存储库
-
你是对的;查看数据库文件的属性;
copy to output Directory;如果是copy if newer,那么每次更改数据并构建项目时,您的更改都会被覆盖。解决方法:在开发过程中,设置硬编码的路径,防止文件被复制。Image -
一个大问题是用
catch{return false;}隐藏异常,这样你就不知道出了什么问题。例外是熔断的保险丝。你不要忽视他们
标签: c# wpf sqlite caliburn.micro .net-framework-version