我在SQLite中遇到了一个奇怪的问题,这是我所做的步骤:
Git 存储库: https://github.com/moon1234moon/SQLiteApp
步骤:
-
我在SQLite中创建了表用户,并将其添加到解决方案中的前端项目中
-
然后,我将其包含在项目中,并将其属性设置为:
{
"Build Action" => "Content",
"Copy to Output Directory" => "Copy if newer"
}
- 使用此 c# 代码,我使用不同类中的两个函数将数据插入到 Users 表中:
第一个功能:
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;
}
}
这就是问题所在
但是结果与我从SQLite的DB Blaweser获得的结果相矛盾:
- 在数据库浏览器中,我得到了一个空的用户表
- 在 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
目录中 - 当数据库浏览器从项目目录获取时
问题是它们不同步..我们如何解决这个问题???
我写的东西没有错,因为真正发生的事情是Microsoft Visual Studio 正在将数据写入/bin/debug
目录中的调试数据库,而不是项目中的数据库中。
另外,考虑到我设置为项目目录中的 Db 的属性
{
"Build Action" => "Content",
"Copy to Output Directory" => "Copy if newer"
}
每次此数据库不存在或每次更改时,都会重新部署此数据库。所以这是一个空白数据库(项目目录中的那个(,如果它被更改或不存在,它会覆盖使用的数据库,它会再次填充它。
所以这是处理SQLite数据库的正常方法,我的代码没有任何问题。