从表中删除行时删除文件

时间:2009-11-11 19:28:58

标签: asp.net sql-server sqldatasource

在我的网站上,我使用简单的文件管理。用户可以上传文件,查看列表并删除它们。在数据库中,我有一个表Files,其中包含有关文件的信息(文件名,说明,插入日期)。

我使用GridView显示SQLDataSource控件中的所有文件。

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

我想要做的是当用户从表中删除行时删除asocciated文件。我试图在OnDeleting事件中执行此操作,但它必须执行另一个SELECT来获取文件名。这是唯一的方法吗?还是其他更好的方式?或者如何从OnDeleting事件中获取文件名?

已编辑:数据库是SQL Server,但在这种情况下并不重要。我将文件存储在文件系统中。在数据库中只有文件名。

5 个答案:

答案 0 :(得分:2)

不是直接删除行,而是创建一个名为deleteFile(@ID int)之类的存储过程。在此proc中,获取文件名:

Select FileName From Files Where ID = @ID

然后删除文件,使用任何用于删除实际文件的方法。

然后删除行

Delete Files Where ID = @ID

答案 1 :(得分:1)

如果从GridView.RowDeleting事件中尝试此操作,则可以使用传入的参数GridViewDeleteEventArgs来获取要删除的行。假设名称在此行中,您可以使用它来删除文件。

答案 2 :(得分:1)

我知道它们可能是邪恶的,但这似乎是一个可以使用触发器的地方,这样如果删除查询从多个地方运行,文件仍然会被删除。

如果是MS SQL

DECLARE @Command varchar(8000)
SELECT @Command ='del c:\'+ DocID FROM Deleted
xp_cmdshell @Command

答案 3 :(得分:0)

您需要某种方式将表条目与文件交叉引用 - 可能它们都有唯一的文件名?如果是这样,您可以使用它从您发出DB delete命令的代码隐藏中的同一位置删除该文件。

答案 4 :(得分:0)

卢卡斯,

如果使用Gridview绑定数据,可以定义DataKeyNames属性,然后在RowDeleting事件中执行以下操作:

string documentName = (string)GridName.DataKeys[e.RowIndex].Value;
DeleteDoc(documentName);