Одна проблема состоит в том, что ваш код сбивает с толку.
string [] a = {"" 'a.jpg', 'b.jpg', 'c.jpg' "}
Во-первых, у вас есть двойное "в начале, должно быть только один.массив с одним элементом,
a[0] = "'a.jpg', 'b.jpg', 'c.jpg'";
Затем вы выполняете foreach для этого, который естественным образом выполняется один раз, что приводит к следующему запросу:
delete from table1 where name not in ('a.jpg', 'b.jpg', 'c.jpg')
Но когда вы загружаете массив динамически, вы, вероятно, получаетеэтот массив
a[0] = 'a.jpg';
a[1] = 'b.jpg';
a[1] = 'c.jpg';
, который будет выполняться 3 раза в foreach, что приведет к следующим 3 запросам
delete from table1 where name not in ('a.jpg')
delete from table1 where name not in ('b.jpg')
delete from table1 where name not in ('c.jpg')
После второго таблица будет пуста.
Вместо этого вы должны попробовать это:
string[] names = { "a.jpg", "b.jpg","c.jpg","j.jpg" };
string allNames = "'" + String.Join("','", names) + "'";
OleDbCommand sqlcmd = new OleDbCommand("delete from table1 where name not in (" + allNames + ")", sqlconnection);
sqlcmd.ExecuteNonQuery();
Где имена создаются динамически, потому что это приведет к следующему запросу, соответствующему вашему тесту:
delete from table1 where name not in ('a.jpg', 'b.jpg', 'c.jpg')
Мой предпочтительный способ динамического заполнения массивавместо этого использовать список, так как чистый массив имеет фиксированный размер, и любое изменение требует создания нового массива.
Вы можете перебирать список так же легко, как массив.
List<string> names = new List<string>();
//or user var keyword
var names = new List<string>();
Тогда просто используйте метод add для объявленияэлементы d, зациклите это при необходимости.
names.Add(filename);
Затем для объединения:
string allNames = "'" + String.Join("','", names.ToArray()) + "'";
И все готово.
Или вы можете использовать
string[] filePaths = Directory.GetFiles(@"c:\MyDir\", "*.jpg");
string[] names = filePaths.ToList().ConvertAll(n => n.Substring(n.LastIndexOf(@"\") + 1)).ToArray();