我有一个名为ImageData的类,其中包含一个标签列表。只有当图像具有1个以上的标签时,我才会收到数据库锁定错误,并且我无法找出为什么0标签和1标签总是可以的原因,无论是1个图像还是100个图像。只要1个图像具有2个标签,我就会收到错误
我确保使用using语句处理所有内容
方法如下
public static int addImages(List<ImageData> images)
{
int rows = 0;
using (SQLiteConnection con = new SQLiteConnection(ConnectionString()))
{
con.Open();
foreach (ImageData img in images)
{
using (SQLiteCommand cmd = new SQLiteCommand($"INSERT INTO images(Hash, Extension, Name) VALUES(@IHash,@IExtension, @IName)", con))
{
cmd.Parameters.AddWithValue("@IHash", img.Hash);
cmd.Parameters.AddWithValue("@IExtension", img.Extension);
cmd.Parameters.AddWithValue("@IName", img.Name);
rows += cmd.ExecuteNonQuery();
}
foreach (Tag tag in img.Tags)
{
using (SQLiteCommand cmd = new SQLiteCommand($"INSERT INTO ImagesTags(ImageHash, TagName) VALUES(@IHash,@IName)", con))
{
cmd.Parameters.AddWithValue("@IHash", img.Hash);
cmd.Parameters.AddWithValue("@IName", tag.Name);
cmd.ExecuteNonQuery();
}
}
}
con.Close();
}
return rows;
}
这是我的表创建
string[] createTable =
{
"CREATE TABLE images(Hash TEXT PRIMARY KEY, Extension TEXT, Name TEXT)",
"CREATE TABLE tags(NAME TEXT PRIMARY KEY NOT NULL,DESCRIPTION TEXT,COLLECTIONNAME TEXT)",
"CREATE TABLE ImagesTags(ImageHash TEXT,TagName TEXT,Primary KEY (ImageHash, TagName),FOREIGN KEY (ImageHash) REFERENCES images(Hash),FOREIGN KEY (TagName) REFERENCES tags(Name))"
};
在foreach循环中插入数据的情况有很多,但这是唯一出现此错误的地方。
1条答案
按热度按时间vdgimpew1#
在谷歌上搜索了很多之后,我了解到了使用sqlite的更干净的方法。
通过对每个连接、命令、事务和读取器使用using语句解决了这个问题。
一定是某个地方的某样东西被错误地处理了
这里的函数与前面的函数相同,但是我使用了更好的代码,我还添加了事务,以便只对数据库进行一次调用,并且在出现错误时允许回滚