【问题标题】:SQLite Connections-Results in C#SQLite 连接 - C# 中的结果
【发布时间】:2020-05-13 18:45:00
【问题描述】:

我在 SQLite 中遇到了一个奇怪的问题,这是我执行的步骤:

Git 仓库: https://github.com/moon1234moon/SQLiteApp

步骤:

  1. 我在 SQLite 中创建了表 Users 并将其添加到解决方案中的前端项目中

  2. 然后我将它包含在项目中并将其属性设置为:

{
  "Build Action" => "Content",
  "Copy to Output Directory" => "Copy if newer"
}
  1. 使用这个 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');
  1. 之后我尝试从 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


【解决方案1】:

我写的没有问题,因为真正发生的是 Microsoft Visual Studio 正在将数据写入位于/bin/debug 目录中的调试数据库不在 strong> 项目中的数据库。

另外,考虑到我为项目目录中的 Db 设置的属性

{
    "Build Action" => "Content", 
    "Copy to Output Directory" => "Copy if newer"
}

每次不存在或每次更改时,此数据库都会重新部署。所以这是一个空白数据库(项目目录中的那个),如果它被更改或不存在,它会覆盖使用的数据库。

所以这是处理 SQLite 数据库的正常方式,我的代码没有任何问题。

【讨论】:

  • 不,您的应用程序正在通过指定路径将记录写入您告诉它使用的数据库。当您使用相对路径时,它是相对于工作文件夹的。默认工作目录是应用程序可执行文件的目录。调试时是bin/debug - 这就是可执行文件所在的位置。这就是将要打包和部署的内容。
  • INSERT 语句也有更严重的问题,比如将本地化字符串存储为日期。 SQLite 只识别the ISO8601 string literal as a date
  • @PanagiotisKanavos .. 考虑到您的第一条评论,在我的回答中,我解释了为什么它将数据库保存在可执行文件所在的文件夹中。
  • 事实并非如此。做任何事情的不是 Visual Studio。连接字符串(未发布)包含相对路径。任何应用程序的工作文件夹都是它启动的文件夹,除非在启动它时指定了不同的文件夹。 VS 没有指定不同的工作文件夹,所以应用程序的位置就是工作文件夹。
  • 在部署应用程序时也必须考虑到这一点。如果您尝试使用 ../..project 文件夹访问内容文件(设置、图像等),在部署中代码将尝试从错误的文件夹加载它们。
猜你喜欢
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多