如何跟踪从SQL Server下载的文件的进度?

时间:2017-08-01 16:33:41

标签: c# sql-server vb.net file download

我的winforms应用程序正在从SQL Server接收文件,我想以进度条的形式显示已下载了多少文件。

要检索文件,我正在调用存储过程并将结果保存到一个字节数组中:

Dim file() as Byte = SQLCommand.ExecuteScalar()

这样可以正常工作,对于较小的文件,我不需要进度条,因为它们很快完成。但是,有些文件可能会变得很大,而且有些连接可能不是很好,所以我认为我需要某种进度指示。

据我所知,我可能需要使用后台工作线程,我知道如何做到这一点。但是,如何定期检查已收到多少文件,就像我一样,它似乎在一个大块中执行操作?

可以这样做吗?或者我是否需要查看我完全收到该文件的方式?

我的应用程序是VB.Net,但C#答案是完全可以接受的。

2 个答案:

答案 0 :(得分:3)

SqlClient Streaming Support。您需要执行以下几个步骤:

链接文章显示了有关如何完成流媒体部分的更多细节,之后添加进度条是微不足道的。

答案 1 :(得分:2)

您可以将.NET 4.5中的流功能与异步编程模型结合使用。

private static async Task CopyBinaryValueToFile() {  
         string filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "binarydata.bin");  

         using (SqlConnection connection = new SqlConnection(connectionString)) {  
            await connection.OpenAsync();  
            using (SqlCommand command = new SqlCommand("SELECT [bindata] FROM [Streams] WHERE [id]=@id", connection)) {  
               command.Parameters.AddWithValue("id", 1);  

               // The reader needs to be executed with the SequentialAccess behavior to enable network streaming  
               // Otherwise ReadAsync will buffer the entire BLOB into memory which can cause scalability issues or even OutOfMemoryExceptions  
               using (SqlDataReader reader = await command.ExecuteReaderAsync(CommandBehavior.SequentialAccess)) {  
                  if (await reader.ReadAsync()) {  
                     if (!(await reader.IsDBNullAsync(0))) {  
                        using (FileStream file = new FileStream(filePath, FileMode.Create, FileAccess.Write)) {  
                           using (Stream data = reader.GetStream(0)) {  

                              // Asynchronously copy the stream from the server to the file we just created  
                              await data.CopyToAsync(file);  
                           }  
                        }  
                     }  
                  }  
               }  
            }  
         }  
      }  

看到这个: sqlclient-streaming-support