c# - 在服务器和客户端之间发送查询结果的最有效方式是什么

标签 c# sql client-server

我有这个用 C# 编写的服务器/客户端应用程序。服务器端有一个 SQL Server,当客户端需要一个表时,它向服务器应用程序发送请求,服务器应用程序连接到 SQL Server 并检索表并通过 NetworkStream 将其发送给客户端。

这是发送数据集 XML 流的服务器端代码

using (var networkStream = new NetworkStream(m_workerSocket[0]))
{
     dataSet.WriteXml(networkStream);
}

我正在以字节形式读取这个 xml 文件并将其转换为字符串,然后再次将其转换为数据集。 这是客户端代码:

TextReader reader = new StringReader(richTextRxMessage.Text);
DataSet dataSet = new DataSet();
dataSet.ReadXml(reader);
DataTable dtProd = new DataTable();
dataGridView1.DataSource = dataSet.Tables[0];

我的问题是这是在客户端/服务器之间发送表的有效方式吗?像 10k 条目这样的大表会有问题吗?我可以做些什么来优化它?

除了这些表之外,服务器和客户端之间还会有很多通信,例如即时消息或不同类型的文件。那么我如何处理和分类大量数据,无论是文件还是数据集等。例如,我应该在发送数据之前放置自定义字符串标记(例如 <DATASET>, <DOCFILE> 等)以识别我发送的数据类型? 谢谢。

PS:我正在使用异步服务器和客户端来发送和接收数据。

最佳答案

取决于您所说的高效。有几个权衡取舍。你想节省带宽吗?那么像 JSON 和 XML 这样的纯文本格式就不是可行的方法了。使用不那么冗长且支持压缩而不必使用 Base64 编码的协议(protocol)是一个更好的主意。当然,这意味着您将使用更多的 CPU 周期。还需要考虑缓存。您能否验证客户的数据自上次请求以来是否已失效?如果是这样,那么可以存储整个集合甚至部分集合的缓存机制将节省更多带宽。当然,这意味着如果您直接缓存到驱动器,您将使用更多的内存和可能更多的硬盘空间。

我认为您的问题比您意识到的要深一些。

关于c# - 在服务器和客户端之间发送查询结果的最有效方式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13661864/

相关文章:

C++通过UDP发送数据包但没有收到

c# - 谓词和 OrderBy , Func

c# - 在 Crystal Report 和 ASP.NET C# 中使用子报表

c++ - getaddrinfo 始终连接。即使没有 passive-open 连接监听该端口

c# - 主键与唯一键冲突异常处理

mysql - SQL:我们需要 ANY/SOME 和 ALL 关键字吗?

Java:当互联网可用时客户端自动连接到服务器

c# - 如何比较从 Reflection 的 "GetValue"获取的值类型?

c# - 如何在 C# 中的 https 调用中获取 header 值

SQL (server 2016) - 使用 CASE 的结果作为子查询的 where 子句