2011-01-25 5 views
0

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

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

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

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();         }` 
+2

Привет Сафи, вы можете разместить код? похоже, нужно проверить String.IsNullOrEmpty, чтобы убедиться, что в массиве есть значение. – WraithNath

+0

. Отображение большего количества кода поможет определить проблему. – Grozz

+0

string [] names = {"'a.jpg', 'b.jpg', 'c.jpg', 'j.jpg'"}; для (int j = 0; j safi

ответ

6

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

string [] a = {"" 'a.jpg', 'b.jpg', 'c.jpg' "} 

Во-первых, у вас есть двойной "в начале, должен быть только один.

string [] a = {" 'a.jpg', 'b.jpg', 'c.jpg' "} 

Тогда это создает массив строк с одним элементом,

a[0] = "'a.jpg', 'b.jpg', 'c.jpg'"; 

Тогда вы делаете foreach на этом, который natuarly ony выполняет один раз в результате этого запроса:

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 раза в Еогеаспе приводит к следующим 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(); 

Где имена создается динамически ofcause, и это приведет в следующем запросе соответствие тест:

delete from table1  where name not in ('a.jpg', 'b.jpg', 'c.jpg') 

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

Вы можете перебрать список как eacy, как массив.

List<string> names = new List<string>(); 
//or user var keyword 
var names = new List<string>(); 

Затем просто добавьте метод добавления элементов, зациклируйте его по мере необходимости.

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(); 
+0

@ Дэвид Мартенссон, мне нравится ваше предложение и ценю ваши усилия, чтобы найти время, чтобы обеспечить хорошее решение. в вашем коде кода, предположим, моя строка [] a = {}, и я хочу заполнить этот массив именами файлов изображений из каталога, пусть скажет c:/images /, то что мне нужно сделать? Спасибо – safi

+0

Se мое дополнение в конце для создания массива. –

+0

@ Дэвид Мартенссон, Спасибо за это, я решил проблему, ваша душа помогла мне избавиться от неприятностей :) – safi

0

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

+0

@ telos: Я правильно прочитал файл, но проблема заключается в получении значений из массива :( – safi

+0

вы можете рассказать, как я могу получить все имена файлов в массиве, у меня есть цикл и массив, но cant получить массив, чтобы заполнить его, я думаю, проблема заключается в заполнении массива из имен файлов. - safi 0 сек назад – safi

1

размещения мой комментарий как ответ

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

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

должно быть

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

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

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

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

строка [] lok = {}; foreach (строка f в Directory.GetFiles (d, "*. *")) {lok [j ++] = Path.GetFileName (f);} – safi

+0

вы можете рассказать, как я могу получить все имена файлов в массиве, у меня есть цикл и массив, но не могу получить массив, который нужно заполнить, я думаю, что проблема заключается в заполнении массива из имен файлов. – safi

+0

@safi: обновлено для того, как читать имена файлов в виде строкового массива, где исходный каталог = местоположение, например, string sourceDirectory = "c: \ \ емк эс \\ "; – Manatherin

0

Вам нужно определить массив так:

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

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

" 'a.jpg', 'b.jpg','c.jpg','j.jpg' " 
+0

@ деревняLdiot: работает код, но проблема в том, что я не хочу статических значений строк в именах массивов, я определяю массив вроде этого, String [] names; а затем заполнить его через цикл и вставить в массив имена файлов. – safi

+0

Если вы не хотите определять массив заданной длины, используйте вместо этого список . –

+0

@ stephen, list? как? – safi

0

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

Вам необходимо выполнить объединение в массиве, чтобы сгенерировать одну строку для предложения 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

Да, я отправляю этот код, поскольку этот запрос работает со статическим массивом, но с динамическим массивом он не делает :(, у меня есть код, который вы можете увидеть, как я его динамически динамически :) – safi

0

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

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

Как обсуждалось в других ответах, вы можете захотеть изменить свой SQL-запрос –

Смежные вопросы