2016-02-29 123 views
0

我有一个约350个音乐文件的列表,我存储在一个sqlite表中。如果新文件被添加,它们将被添加到数据库中。所以我有一个查询来检查文件的路径是否在表中,如果没有,然后插入它。但是,即使它们在表格中,3个文件也不匹配查询!因此,每次启动我的应用程序时,都会反复添加它们。sqlite查询不匹配字符串

我正在使用适用于通用Windows平台的SQLite &用于SQL内容的SQLite.Net-PCL软件包。文件是我的自定义类,它存储每个文件的一些字符串和其他文件属性。

//database creation on first app launch 
using (var db = DbConnection) 
{ 
     var Trackdb = db.CreateTable<Query>(); 
} 

//where I scan all files and add to db if not already there 
var dbconn = DbConnection; 
foreach (File file in FileList) 
{ 
     var existingfile = dbconn.Query<Track>("select * from File where Path = '" + file .Path.Replace("'", "''") + "'").FirstOrDefault(); 
     if (existingtrack == null) 
     { 
      file.ID = dbconn.Insert(file); 
      Debug.WriteLine(file.Path + " was added to db"); 
     } 
} 

输出每次,从我看到可能有2个字符可能会导致这种情况,但为什么? “ - ”vs“ - ”和“ë”与“e”。是sqlite没有装备处理这些字符或我的查询不够健壮?插入语句工作正常,导致我相信它接受这些字符,因为它显示我的我的应用程序罚款。

"C:\Data\Users\Public\Music\David Guetta & Avicii – Sunshine.mp3 was added to db" 
"C:\Data\Users\Public\Music\Gotye - Somebody That I Used To Know (Tiësto Remix).mp3 was added to db" 
"C:\Data\Users\Public\Music\Lana Del Rey – Summertime Sadness (Cedric Gervais Remix).mp3 was added to db" 

编辑:由柱先生X解决

var existingfile = dbconn.Query<File>("SELECT * FROM Track WHERE Path = ?", file.Path.Replace("'", "''")).FirstOrDefault(); 
+0

两件事伸出:1)可以使用两种不同类型的'File'和'Track',为什么? 2)你没有参数化你的SQL,这可能与你的角色问题有关(“ - ”vs“ - ”和“ë”与“e”)。 –

+0

嗨,对不起,这是一个复制粘贴错误,它应该是查询,你是什么意思,我没有参数化我的SQL? – user2704766

+0

我明白你的意思 - 看起来像是修复。谢谢! – user2704766

回答

0

通过柱先生X解决

  var existingfile = dbconn.Query<File>("SELECT * FROM File WHERE Path = ?", file.Path.Replace("'", "''")).FirstOrDefault();