在我的网站上,我使用简单的文件管理。用户可以上传文件,查看列表并删除它们。在数据库中,我有一个表Files
,其中包含有关文件的信息(文件名,说明,插入日期)。
我使用GridView
显示SQLDataSource
控件中的所有文件。
DeleteCommand="DELETE FROM Files WHERE id = @id"
我想要做的是当用户从表中删除行时删除asocciated文件。我试图在OnDeleting
事件中执行此操作,但它必须执行另一个SELECT
来获取文件名。这是唯一的方法吗?还是其他更好的方式?或者如何从OnDeleting
事件中获取文件名?
已编辑:数据库是SQL Server,但在这种情况下并不重要。我将文件存储在文件系统中。在数据库中只有文件名。
答案 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);