1

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

我显示所有GridView控制的文件SQLDataSource

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

我想要做的是在用户从表中删除行时删除关联文件。我试图在OnDeleting事件中这样做,但它接缝我必须执行另一个SELECT来获取文件名。这是唯一的方法吗?还是有其他更好的方法?或者如何从OnDeleting事件内部获取文件名?

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

4

5 回答 5

2

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

Select FileName From Files Where ID = @ID

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

然后删除该行

Delete Files Where ID = @ID
于 2009-11-11T19:52:46.893 回答
1

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

于 2009-11-11T19:35:18.617 回答
1

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

如果是 MS SQL

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

于 2009-11-11T19:44:56.820 回答
0

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

于 2009-11-11T19:34:59.707 回答
0

卢卡斯

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

string documentName = (string)GridName.DataKeys[e.RowIndex].Value;
DeleteDoc(documentName);
于 2009-11-11T19:39:50.637 回答