从sql server通过WCF到客户端的大数据流

时间:2016-02-01 11:19:24

标签: sql-server wcf streaming large-files

使用SQL数据库存储大数据文件(CSV文件为1 GB)的可能方法是什么?使用WCF将数据从数据库传输到客户端(不在内存中提取完整数据)?

1 个答案:

答案 0 :(得分:0)

我认为这里有一些问题需要考虑:

  • 您实际想要返回的数据大小
  • 该数据的结构(或缺乏数据)
  • 将数据存储在NLB背后的地方
  • 将该数据返回给消费者。

从您的问题来看,您可能希望存储1 GB的结构化(CSV)数据并将其流式传输到客户端。如果你真的在生成然后提供1GB文件(并且周围没有很多元数据),那我就去使用FTP / SFTP服务器(或者可能是网络文件共享,这当然可以是以各种方式保护)。

如果您需要存储超出其文件名/创建时间/位置的文件的元数据,那么SQL可能是一个不错的选择,假设您可以执行以下操作之一:

  • 以表格格式将CSV数据存储在数据库中
  • 使用FILESTREAM并自行存储文件

Here is a decent primer on FILESTREAM from SimpleTalk。然后,您可以使用SqlFileStream来帮助从文件本身流式传输数据(SQL Server将帮助您保持事务一致性,您可能需要或可能不需要),其中的一个示例存在于{{ 3}}。相关部分如下:

private static void ReadFilestream(SqlConnectionStringBuilder connStringBuilder)
{
    using (SqlConnection connection = new SqlConnection(connStringBuilder.ToString()))
    {
        connection.Open();
        SqlCommand command = new SqlCommand("SELECT TOP(1) Photo.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT() FROM employees", connection);

        SqlTransaction tran = connection.BeginTransaction(IsolationLevel.ReadCommitted);
        command.Transaction = tran;

        using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                // Get the pointer for the file
                string path = reader.GetString(0);
                byte[] transactionContext = reader.GetSqlBytes(1).Buffer;

                // Create the SqlFileStream
                using (Stream fileStream = new SqlFileStream(path, transactionContext, FileAccess.Read, FileOptions.SequentialScan, allocationSize: 0))
                {
                    // Read the contents as bytes and write them to the console
                    for (long index = 0; index < fileStream.Length; index++)
                    {
                        Console.WriteLine(fileStream.ReadByte());
                    }
                }
            }
        }
        tran.Commit();
    }
}

或者,如果您确实选择以表格格式存储它,则可以使用典型的SqlDataReader方法,或者bcp和.NET帮助程序的某种组合。

您应该能够将最后一个链接与documentation结合使用,以获得所需的结果。