Удаление нескольких строк из базы данных доступа - PullRequest
0 голосов
/ 25 января 2011

Я хочу удалить несколько записей из базы данных доступа, используя массив.Массив загружается динамически из имен файлов.

Затем я запрашиваю базу данных и проверяю, совпадают ли значения столбца базы данных со значениями массива; если нет, то удаляем его, если совпадают, не удаляем его.

проблема в том, что: Ниже приведен код, который удаляет все записи независимо от того, где в условии.

arrays = Directory.GetFiles(sdira, "*", SearchOption.AllDirectories).Select(x => Path.GetFileName(x)).ToArray();
    fnames.AddRange(arrays); 

    here I have use also for loop but that also didnt help me out :( like for(int u = 0; u < arrays.length; u++) { oledbcommand sqlcmd = new oledbcommand ("delete from table1 where name not in ("'+arrays[u]+"')",sqlconnection);
   I am using this one currently foreach(string name in arrays)
   {
       OleDbCommand sqlcmd = new OleDbCommand("delete from table1 where name not in ('" + name + "')", sqlconnection);
       sqlcmd.ExecuteNonQuery();                                  }`

Ответы [ 6 ]

6 голосов
/ 25 января 2011

Одна проблема состоит в том, что ваш код сбивает с толку.

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();
1 голос
/ 25 января 2011

отправка моего комментария в качестве ответа

ваша строка не читает 4 записи, она читает одну запись из

string names = " 'a.jpg', 'b.jpg','c.jpg','j.jpg' ";

должно быть

string[] names = { "a.jpg", "b.jpg","c.jpg","j.jpg" };

раньше у каждого для каждого был счет 1, теперь он должен иметь счет 4 с фактическими значениями

Edit: Не очень много усилий в этом решении, я должен признать, но если вы хотите, чтобы динамический ввод мог сделать что-то вроде:

    string name = " 'a.jpg', 'b.jpg','c.jpg','j.jpg' ";
    string[] names = name.Split(',').Select(x => x.Trim(' ').Trim('\'')).ToArray();

будет обновляться позже, если я получу изменение, так как настройки не очень хорошие

Для заполнения, если вы хотите, чтобы оно было перечислимо, примером может быть что-то вроде

IEnumerable<string> filelocations = Directory.GetFiles(sourceDirectory, "*", SearchOption.AllDirectories).Select(x => Path.GetFileName(x));

или для строкового массива

string [] lok = Directory.GetFiles(sourceDirectory, "*", SearchOption.AllDirectories).Select(x => Path.GetFileName(x)).ToArray();
0 голосов
/ 25 января 2011

Попробуйте использовать список, если вы не хотите создавать массив статического размера

List<string> names = new List<string>();
names.Add("a.jpg");
names.Add("b.jpg");
names.Add("c.jpg");


foreach (string name in names)
{
   OleDbCommand sqlcmd = new OleDbCommand("delete from table1 
   where name not in (" + name + ")", 
   sqlconnection); 
   sqlcmd.ExecuteNonQuery(); 
}
0 голосов
/ 25 января 2011

Код в вашем комментарии удалит все файлы, не соответствующие первому файлу.это были бы все файлы, отличные от '.jpg'.Следующая итерация удалит все файлы, которые не соответствуют 'b.jpg', который будет 'a.jpg'.Это приводит к пустой таблице. Редактировать: Объявление массива, которое вы имеете, генерирует хорошее предложение IN, когда вы делаете это вручную, но когда вы получаете список имен файлов, вы не генерируете эту же строку.

Вам необходимо выполнить объединение массива, чтобы сгенерировать одну строку для вашего предложения where, таким образом, предложение where включает все файлы.Ваше предельное предложение where должно выглядеть следующим образом:

where name not in ('a.jpg','b.jpg','c.jpg','d.jpg')

Прямо сейчас у вас есть:

where name not in ('a.jpg')

... следующая итерация

where name not in ('b.jpg')

Кроме того, помните, чтоIN операции обходятся дороже, и чем длиннее массив, тем быстрее растет запрос.

0 голосов
/ 25 января 2011

Вы должны определить массив следующим образом:

string[] names = { "a.jpg", "b.jpg", "c.jpg", "j.jpg" };

способ определения массива, который содержит только одно значение:

" 'a.jpg', 'b.jpg','c.jpg','j.jpg' "
0 голосов
/ 25 января 2011

Похоже, вы либо неправильно читаете файл, либо файл пуст. Вы должны проверить массив, чтобы убедиться, что он не пустой перед запуском операции с базой данных. Если массив пуст, он ДОЛЖЕН удалить все данные из базы данных, поскольку совпадений нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...