SQLite连接的结果是C#
我在SQLite中遇到了一个奇怪的问题,以下是我执行的步骤: 吉特回购: 步骤:SQLite连接的结果是C#,c#,wpf,sqlite,caliburn.micro,.net-framework-version,C#,Wpf,Sqlite,Caliburn.micro,.net Framework Version,我在SQLite中遇到了一个奇怪的问题,以下是我执行的步骤: 吉特回购: 步骤: 我在SQLite中创建了表用户,并将其添加到解决方案中的前端项目中 然后,我将其包括在项目中,并将其属性设置为: 使用此c#代码,我使用不同类中的两个函数将数据插入用户表: 第一个功能: public void Register(UserModel user, string password, bool autoLogin = true) { string hashedPassword = Hasher.Has
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');
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;
}
}
第二个功能:
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');
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;
}
}
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');
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;
}
}
公共静态bool CheckIfUsernameExist(字符串用户名)
{
尝试
{
使用(IDbConnection cnn=new SQLiteConnection(ConnectionString()))
{
string query=queryBuilder.GetByUsername(用户名);
var user=cnn.Query(Query,newdynamicparameters()).ToList();
如果(user.Count>0)
{
返回true;
}
返回false;
}
}
抓住
{
返回false;
}
}
问题就在这里
但结果与我从SQLite的DB Broweser获得的结果相矛盾:
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');
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浏览器中,我得到了一个空的Users表
- 在C#中,我得到: 用户变量:
{
用户:
{
计数:1 System.Collections.Generic.List,
[0]:DataAccess.Authentication.Models.UserModel}DataAccess.Authentication.Models.UserModel
{
CreatedDate{1/28/2020 12:05:56 PM}System.DateTime
FirstName“Admin”字符串
ID1INT
LastName“Admin”字符串
密码“32EgQocI8Oinbm3k4ZszPNXiHDE8ZpA+FJemCoevr8dTkKVT”字符串
更新日期{1/28/2020 12:05:56 PM}System.DateTime
用户名“admin”字符串
}
}
}
为什么不同。。。
经过一些测试证明:
- C#正在将数据保存在
目录中/bin/debug
- 当DB浏览器从项目目录获取数据时
问题是它们没有同步。。我们如何解决这个问题呢?我写的东西没有什么问题,因为真正发生的事情是Microsoft Visual studio正在将数据写入
/bin/debug
目录中的调试数据库,而不是project中的数据库
另外,考虑到我为项目目录中的Db设置的属性
{
"Build Action" => "Content",
"Copy to Output Directory" => "Copy if newer"
}
每次不在或每次更改时,都会重新部署该数据库。因此,这是一个空白数据库(项目目录中的数据库),如果它被更改,或者如果它不在那里,它将覆盖已使用的数据库,然后再次填充它
所以这是处理SQLite数据库的正常方法,我的代码没有问题 请帮忙!!我添加了整个存储库,如果有人需要检查您是否正确;查看数据库文件的属性<代码>复制到输出目录;如果是
copy if newer
,则每次更改数据和生成项目时,您所做的更改都将被覆盖。解决方案:在开发过程中,设置硬编码的路径并防止复制文件。一个大问题是使用catch{return false;}
隐藏异常,这样您就不知道出了什么问题。保险丝熔断是例外情况。您不能忽略它们否,您的应用程序正在通过指定其路径将记录写入您告诉它要使用的数据库。使用相对路径时,它是相对于工作文件夹的。默认工作目录是应用程序可执行文件的目录。这就是调试时的bin/debug
——这就是可执行文件所在的位置。INSERT语句也有更严重的问题,比如将本地化字符串存储为日期。SQLite只能识别@PanagiotisKanavos。。考虑到你的第一条评论,在我的回答中,我解释了为什么它会将数据库保存在可执行文件所在的文件夹中。事实并非如此。不是VisualStudio做了什么。连接字符串(未发布)包含相对路径。任何应用程序的工作文件夹都是它启动时所在的文件夹,除非启动时指定了不同的文件夹。VS没有指定其他工作文件夹,因此应用程序的位置是工作文件夹。在部署应用程序时,您也必须考虑到这一点。如果尝试使用。/…
从项目文件夹访问内容文件(设置、图像等),则在部署中,代码将尝试从错误的文件夹加载这些文件。