【问题标题】:Delete file when deleting row from table从表中删除行时删除文件
【发布时间】:2009-11-11 19:28:58
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: asp.net sql-server sqldatasource


    【解决方案1】:

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

    Select FileName From Files Where ID = @ID
    

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

    然后删除该行

    Delete Files Where ID = @ID
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        如果是 MS SQL

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 我在表格中有文件名。但问题是如何从 OnDelete 事件中获取文件名?我应该调用 SELECT 还是有任何机制可以获取所有受影响的行(例如 SQL Server 中触发器内部的表 DELETED)。
          【解决方案5】:

          卢卡斯,

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

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

          【讨论】:

            猜你喜欢
            • 2019-02-18
            • 1970-01-01
            • 2010-10-22
            • 1970-01-01
            • 2021-02-25
            • 2018-03-12
            相关资源
            最近更新 更多