Удалить файл при удалении строки из таблицы - PullRequest
1 голос
/ 11 ноября 2009

На моем сайте я использую простое управление файлами. Пользователь может загружать файлы, просматривать список и удалять их. В базе данных у меня есть одна таблица Files, которая содержит информацию о файлах ( имя файла , описание, дата вставки).

Я отображаю все файлы в GridView элементе управления с помощью SQLDataSource.

DeleteCommand="DELETE FROM Files WHERE id = @id"

Что я хочу сделать, это удалить связанный файл, когда пользователь удаляет строку из таблицы. Я пытался сделать это в OnDeleting событии, но кажется, что мне нужно выполнить еще один SELECT, чтобы получить имя файла. Это единственный способ сделать это? Или это другой лучший способ? Или как получить имя файла из события OnDeleting?

РЕДАКТИРОВАНИЕ: База данных - это SQL Server, но в этом случае это не важно. Я храню файлы в файловой системе. В базе данных есть только имена файлов.

Ответы [ 5 ]

2 голосов
/ 11 ноября 2009

Вместо непосредственного удаления вашей строки создайте хранимую процедуру, которая называется что-то вроде deleteFile (@ID int). Внутри этого процесса получите имя файла:

Select FileName From Files Where ID = @ID

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

Затем удалите строку

Delete Files Where ID = @ID
1 голос
/ 11 ноября 2009

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

, если это MS SQL

ОБЪЯВИТЬ @ Comm varchar (8000)
SELECT @Command = 'del c: \' + DocID FROM Удалено
xp_cmdshell @Command

1 голос
/ 11 ноября 2009

Если вы попробуете это из события GridView.RowDeleting, вы можете использовать переданный параметр GridViewDeleteEventArgs, чтобы получить строку, которую нужно удалить. Предполагая, что имя находится в этой строке, вы можете использовать его для удаления файла.

0 голосов
/ 11 ноября 2009

Лукаш,

Если вы используете Gridview для привязки данных, вы можете определить атрибут DataKeyNames, а затем в событии RowDeleting сделать следующее:

string documentName = (string)GridName.DataKeys[e.RowIndex].Value;
DeleteDoc(documentName);
0 голосов
/ 11 ноября 2009

Вам нужен какой-то способ для перекрестной ссылки на запись таблицы с файлом - возможно, у них обоих есть уникальное имя файла?Если это так, вы можете использовать это для удаления файла из того же места в вашем коде позади, что вы вводите команду удаления БД.

...