Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL删除列表中不包含的项_C#_Sql_Sqlite - Fatal编程技术网

C# SQL删除列表中不包含的项

C# SQL删除列表中不包含的项,c#,sql,sqlite,C#,Sql,Sqlite,总结 如果我想使用SQL从数据库中删除某些项,我会有如下内容: DELETE FROM ScannedFiles WHERE Name NOT IN (`Picture1.bmp`, `Picture2.bmp`, `Picture3.bmp`} DELETE FROM ScannedFiles WHERE Name NOT IN (`Picture1.bmp`, `Picture2.bmp`, `Picture3.bmp`} 但是如何删除大约250个项目的可变列表呢 IEnumerab

总结

如果我想使用SQL从数据库中删除某些项,我会有如下内容:

DELETE FROM ScannedFiles 
WHERE Name NOT IN (`Picture1.bmp`, `Picture2.bmp`, `Picture3.bmp`}
DELETE FROM ScannedFiles 
WHERE Name NOT IN (`Picture1.bmp`, `Picture2.bmp`, `Picture3.bmp`}
但是如何删除大约250个项目的可变列表呢

IEnumerable<string> existingFileNames = ...

using (var dbCommand = dbConnection.CreateCommand())
{
    dbCommand.CommandText = ...

    foreach (string fileName in existingFileNames)
    {
        ... change commandText, and / or add parameters
    }

    dbCommand.ExecuteNonQuery();
}
我不保存完整的文件名,因为这样我可以很容易地在不同的目录中找到MyPicture.bmp的副本

[DirectoryId,Name]的组合有一个唯一的约束:一个目录中的所有文件都有一个唯一的文件名

因此,在我重新扫描的过程中,如果我有一个目录,其中包含一些文件,我需要删除数据库中不再存在的文件

如果我只有几个文件名,我会有如下内容:

DELETE FROM ScannedFiles 
WHERE Name NOT IN (`Picture1.bmp`, `Picture2.bmp`, `Picture3.bmp`}
DELETE FROM ScannedFiles 
WHERE Name NOT IN (`Picture1.bmp`, `Picture2.bmp`, `Picture3.bmp`}
但现在我有了一大串可变长度的文件名

IEnunumerable<string> existingFileNames = ...

using (var dbCommand = dbConnection.CreateCommand())
{
    dbCommand.CommandText = ...
    dbCommand.Parameters.AddWithValue(...);
    dbCommand.ExecuteNonQuery();
}
那么除了不在…中之外,还有其他SQL方法吗。。。要解决这个问题


我正在使用SQLite开发团队3.13.0提供的最新SQLite nuget软件包SQLite,但我愿意更改为不同的SQLite版本。

如果250是最坏的情况,我会保持简单,并继续使用不在。。。具有绑定参数的子句,而不是文字值

对于3.32.0之前的SQLite版本,绑定参数的最大数量为999 之后是32766

根据我的经验,SQLite处理数百个绑定参数的能力出奇地好,
e、 g.查询如选择。。。其中一些列在。。。Android设备上的300K行表中有800个参数

如何将文件名放在临时表中,并使用“从扫描文件中删除”“如果名称不在MyTentable的选择名称中?”如果您使用的是SQL Server,我会说使用表值参数。不幸的是,SQLite没有这样的功能,也许可以使用临时表来代替它?像您的示例那样添加具有字符串值的可变数量的参数是不可靠的。在测试情况下,它看起来可以工作,但可能会达到我记忆中的sql命令参数限制最大值2100个参数,和/或根据默认值,sql命令大小限制为256mb。不要那样做。