【问题标题】:Deleted row from database still shows up in select statement right after delete删除后,从数据库中删除的行仍然显示在 select 语句中
【发布时间】:2019-11-23 14:03:51
【问题描述】:

我有一个使用 sqlite 数据库的 C# 编写的 WPF 项目。

我尝试从表中删除我的行,然后在返回调用该删除的方法后,我尝试获取该表中的所有行并返回已删除的行。

奇怪的是,如果我尝试在删除后立即返回所有行但不返回,那么它会返回所有行减去我删除的行, 但是如果我返回调用方法,然后尝试返回所有行,则会显示已删除的行。

        private void RemoveTagScannersButtonClicked(object sender, RoutedEventArgs e)
    {
        try
        {
            TagScanner tagScanner = (TagScanner)dgTagScanners.SelectedItem;
            ScannerDAO scannerDAO = new ScannerDAO();
            scannerDAO.DeleteScanner(tagScanner.Id);
            //here is where I load the scanners after deleting the scanner row in the database
            //and the deleted scanner row is returned dispite the fact that I just deleted it.
            LoadScannerInformation();
        }
        catch(Exception exc)
        {
            Console.WriteLine("test");
        }          
    }


        internal bool DeleteScanner(int id)
    {
        int result = -1;
        string connectionString = "Data Source=" + LocationManager.DatabaseLocation  + "\\LapCounter.sqlite";
        lock (ConnectionManager.instanceLock)
        {
            using (SQLiteConnection conn = ConnectionManager.CreateConnection(connectionString))
            {
                using (SQLiteCommand cmd = new SQLiteCommand(conn))
                {
                    cmd.CommandText = "DELETE FROM tagscanners WHERE id=@id";
                    cmd.Prepare();
                    cmd.Parameters.AddWithValue("@id", id);
                    try
                    {
                        result = cmd.ExecuteNonQuery();
                        if (result == 0)
                        {
                            return false;
                        }
                    }
                    catch (SQLiteException e)
                    {
                        return false;
                    }
                }
                conn.Close();
            }
        }
        /*I added next line because when I return to the calling method and call 
          GetTagScannersForRace(1) the returned rows include the deleted row, but if I call it 
          right below before I return to the calling method the returned rows does not contain
          the deleted row
         */
        //List<TagScanner>  scanners = GetTagScannersForRace(1);        
        return true;
    }



        private void LoadScannerInformation()
    {
        List<TagScanner> scanners = getTagScanners();
        dgTagScanners.ItemsSource = scanners;
    }




        List<TagScanner> getTagScanners()
    {
        if(_tagScanners.Count == 0)
        {
            ScannerDAO scannerDAO = new ScannerDAO();
            _tagScanners = scannerDAO.GetTagScannersForRace(_raceId);
        }
        return _tagScanners;
    }


        public List<TagScanner> GetTagScannersForRace(int raceId)
    {
        string connectionString = "Data Source=" + LocationManager.DatabaseLocation + "\\LapCounter.sqlite";
        List<TagScanner> scanners = new List<TagScanner>();
        try
        {
            lock (ConnectionManager.instanceLock)
            {
                using (SQLiteConnection conn = ConnectionManager.CreateConnection(connectionString))
                {
                    using (SQLiteCommand cmd = new SQLiteCommand(conn))
                    {
                        cmd.CommandText = "SELECT * FROM tagscanners " +
                        "WHERE raceid=@raceid";
                        cmd.Prepare();
                        cmd.Parameters.AddWithValue("@raceid", raceId);

                        using (SQLiteDataReader reader = cmd.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                TagScanner currentScanner = new TagScanner();
                                currentScanner.Id = Int32.Parse(reader["id"].ToString());
                                currentScanner.TagScannerIp = reader["tagscannerip"].ToString();
                                scanners.Add(currentScanner);
                            }
                        }
                    }
                    conn.Close();
                }
            }
        }
        catch (SQLiteException e)
        {
            return scanners;
        }
        return scanners;
    }

谁能解释为什么在我删除行后,选择所有行返回所有行减去已删除的行, 但是如果我返回调用方法并选择所有行,它将返回所有行,包括已删除的行。

【问题讨论】:

  • 您没有显示选择它的代码,而是其中之一:您的删除 - 没有删除任何内容,或者错误的内容/您的选择和删除正在与不同的数据库(或帐户)/您的数据库交谈坏了
  • 嗨,马克,感谢您的回复!我刚刚添加了选择所有扫描仪的方法。我还验证了 select 和 delete 指向的是同一个数据库。

标签: c# wpf sqlite


【解决方案1】:

Marc Gravell 的评论为我指明了正确的方向。 我删除了数据库,一旦删除我的代码就会为正在运行的应用程序创建一个新的。 现在我的删除实际上确实显示在表中,所以我假设它是一个损坏或损坏的数据库。我从来没有在任何其他 RDBS 上发生过这种情况(这是我第一次使用 sqlite),所以我并没有真正将其视为一个问题。
谢谢马克。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多