我的winforms应用程序正在从SQL Server接收文件,我想以进度条的形式显示已下载了多少文件。
要检索文件,我正在调用存储过程并将结果保存到一个字节数组中:
Dim file() as Byte = SQLCommand.ExecuteScalar()
这样可以正常工作,对于较小的文件,我不需要进度条,因为它们很快完成。但是,有些文件可能会变得很大,而且有些连接可能不是很好,所以我认为我需要某种进度指示。
据我所知,我可能需要使用后台工作线程,我知道如何做到这一点。但是,如何定期检查已收到多少文件,就像我一样,它似乎在一个大块中执行操作?
可以这样做吗?或者我是否需要查看我完全收到该文件的方式?
我的应用程序是VB.Net,但C#答案是完全可以接受的。
答案 0 :(得分:3)
见SqlClient Streaming Support。您需要执行以下几个步骤:
CommandBehavior.SequentialAccess
GetStream
方法访问字段值Stream.Read
)阅读内容,这样您就可以了解您在此过程中的进展情况。链接文章显示了有关如何完成流媒体部分的更多细节,之后添加进度条是微不足道的。
答案 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);
}
}
}
}
}
}
}
}