上传文件时插入数据库

时间:2009-11-12 13:37:15

标签: c# asp.net file

我的asp.net页面中有一个代码,我在数据库中插入一些数据,同时将文件上传到服务器。问题是,似乎应用程序在将文件插入数据库之前等待上载文件。下面是一个类似于我的代码。

public partial class _Default : System.Web.UI.Page
{
    protected HtmlInputFile XLSFileInput;

    ...

    protected void ImportButton_Click(object sender, EventArgs e)
    {
        InsertToDatabase(); //method to insert to database
        XLSFileInput.PostedFile.SaveAs(filePath + fileName);   
    }

    ...
}

这里的问题是,只有在将文件上传到服务器后,才会执行InsertToDatabase()方法。任何帮助表示赞赏。

5 个答案:

答案 0 :(得分:2)

我不建议尝试在ASP.NET中手动控制线程,这是一个纯粹留给IIS的工作。

IMO for ASP.NET处理此问题的更好方法是通过浏览器中的多个AJAX操作调用这些请求,或者设置支持单向操作的WCF服务,因此当您调用“InsertToDatabase”时,它会执行一次火灾,忘记对位于您的数据库上的WCF服务的操作,该服务立即执行,然后继续到下一行代码。然后,IIS正在运行服务方法在其自己的线程中调用的代码。

使用WCF的IMO是在ASP.NET中处理线程的最合适的方法之一。因为您可以轻松地将任何服务方法设置为同步或异步。

修改

Introduction to Building Windows Communication Foundation Services

What You Need To Know About One-Way Calls, Callbacks, And Events

答案 1 :(得分:2)

这与IIS(网络服务器)线程没有任何关系,它更像是一个HTTP“问题”。

在客户端上选择文件,然后在运行任何服务器代码之前将所有响应数据(包括文件)发布到服务器。

因此文件已上传但未在InsertToDatabase()之前保存;被执行。

这种行为只能用几个帖子来解决(例如用ajax)并且可能不适合你。

告诉我们更多关于你想要完成的事情,我们可能会提出一些更好的建议:)。

答案 2 :(得分:1)

这通常是单线程应用程序的工作方式。

从你的代码我猜你使用ASP.NET Web Forms。

您必须考虑关闭InsertToDatabase()操作以释放程序以执行文件上载。也许根据您的版本考虑UpdatePanels是一种快速而肮脏的方法来实现这一目标吗?

您建议将这些操作分开,提供更多详细信息,以帮助确定每项任务的作用以及JavaScript是否可行。

但您的代码示例表明InsertToDatabase()应该在文件保存之前进行。

如果您不确定AJAX / JavaScript,可以使用线程池来执行InsertToDatabase()方法。然而,这完全取决于该方法的作用。请提供更多代码/详细信息。我个人将此用于后台发生的数据库插入(ASP.NET MVC中的日志记录操作过滤器,因此其他用户可能不同意此用法的有效性。但是它可能会节省您学习另一种语言。

ThreadPool.QueueUserWorkItem(delegate
 {
   // Code here
 }
);

答案 3 :(得分:1)

文件上传是HTML表单帖子的一部分。由于上传是表单发布过程的一部分,因此它始终会在任何服务器端代码执行之前发生。 PostedFile.SaveAs()调用不会导致上传,只会保存已作为请求的一部分上传的内容。

如果你绝对需要在上传开始之前插入数据库,你可以按 @Chris Marisic 建议并在提交表单之前将插件作为AJAX调用运行。

答案 4 :(得分:0)

您可以为数据库插入启动另一个线程。例如:

ThreadStart job = new ThreadStart(InsertToDatabase);
Thread thread = new Thread(job);
thread.Start();