【发布时间】: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 指向的是同一个数据库。