查看包含* lot *列的表的最佳方法?

冒着被降级的风险,我想问一下,使用C#,从很多列中查看表中数据的最佳机制(最好对于此处固有的实践违规显然是主观的)。 很多,我的意思是1000。

现在,在你点击所有点击开心之前,或者抛出一些回答,比如“你为什么会有一张包含那么多列的桌子”,让我说它实际上是设计要求的一部分。 我们正在从1000个数据点尽快收集数据。 我们需要尽可能快地存储这些,因此平台。 数据需要直接从SQL Server访问,因此数据库(我们使用带有table-direct的SQL Compact)。

所以,让我们暂时忘记我们所学到的关于正确数据库设计,规范化规则等的所有内容,并且只关注我有一个包含1000列的表的事实,并且我希望能够显示数据屏幕以validation数据实际进入那里。

我试过一个数据网格。 它呕吐因为(毫不奇怪)它不是为处理那么多列而设计的。

我试过在Studio中使用查看器。 它在256之后呕吐,加上最终用户无论如何都不会安装Studio。

目前,结果不一定非常好,它不需要是可更新的,也不需要对数据更改敏感 – 只是在给定时间点表中数据的静态快照。

相关(或半相关)信息:

  • 表有1000列(在点击之前阅读上面的内容)
  • 使用SQL Compact版本3.5
  • 在桌面上运行
  • 寻找托管代码的答案

如果您要实现自己的自定义用户控件,可以像这样执行Fisheye Grid:

死图像链接

此示例显示了在9×10表格中移动的全尺寸3×4面板。 由于(我假设)您不需要编辑此数据,因此UI可能只是用户抓取面板并拖动它的东西。 如果你真的是自虐和/或有很多空闲时间,你甚至可以在同一个网格上有多个鱼眼面板,让你可以同时比较网格的一个或多个区域。

更新:显然,Silverlight 有其中一个 。 有点。

您可以将所有数字格式化为带有空格的n字符字符串,然后以固定宽度字体显示它们。

1 2 3 4 6 36 436 6346 2 3 4 6 36 436 6346 0 3 4 6 36 436 6346 3 4 4 6 36 436 6346 333 222 334 

好吧,对我来说最合适的答案是使用ReportViewer控件 ,但不能以MSDN中记录的任何方式使用。 问题是我有动态数据,因此我需要一个动态报告,并且所有教程等似乎都假设您可以在设计时了解所有内容,因此您可以通过向导指向并单击您的方式。

解决方案最终需要几件。 首先,我必须创建代码来动态生成RDLC,ReportViewer用它来描述报告布局以及哪些数据字段映射到什么。 这就是我提出的:

 public static Stream BuildRDLCStream( DataSet data, string name, string reportXslPath) { using (MemoryStream schemaStream = new MemoryStream()) { // save the schema to a stream data.WriteXmlSchema(schemaStream); schemaStream.Seek(0, SeekOrigin.Begin); // load it into a Document and set the Name variable XmlDocument xmlDomSchema = new XmlDocument(); xmlDomSchema.Load(schemaStream); xmlDomSchema.DocumentElement.SetAttribute("Name", data.DataSetName); // load the report's XSL file (that's the magic) XslCompiledTransform xform = new XslCompiledTransform(); xform.Load(reportXslPath); // do the transform MemoryStream rdlcStream = new MemoryStream(); XmlWriter writer = XmlWriter.Create(rdlcStream); xform.Transform(xmlDomSchema, writer); writer.Close(); rdlcStream.Seek(0, SeekOrigin.Begin); // send back the RDLC return rdlcStream; } } 

第二部分是我从Dan Shipe的博客中获取的 XSL文件。 那里的RDLC代码非常没用,因为它全部用于Web使用,但XSL是纯金。 我已经把它放在这篇文章的底部,以便在博客离线的情况下完整。

一旦我有了这两个部分,只需要创建一个带有ReportViewer控件的Form,然后使用这段代码进行设置:

 ds.DataSetName = name; Stream rdlc = RdlcEngine.BuildRDLCStream( ds, name, "c:\\temp\\rdlc\\report.xsl"); reportView.LocalReport.LoadReportDefinition(rdlc); reportView.LocalReport.DataSources.Clear(); reportView.LocalReport.DataSources.Add( new ReportDataSource(ds.DataSetName, ds.Tables[0])); reportView.RefreshReport(); 

这里的关键是’ds’是一个DataSet对象,其中包含一个DataTable,其中包含要显示的数据。

同样,为了完整性,这里是XSL – 抱歉大小:

      8pt 500 700       1in 1in 1in 1in 11in 8.5in 6.5in en-US true true 7358b654-3ca3-44a0-8677-efe0a55c7c45      0.50in  0.5in0.50in
0.25in
0.25in
SQL 84635ff8-d177-4a25-9aa5-5a921652c79c true DummyDataSource System.Int32 System.String System.DateTime System.Boolean textbox true 7 =Fields!.Value true 7 0.75in

如何将数据存储在csv文件中,这将为您提供查看选项。 如果您的用户有Excel或Open Office Calc,他们可以轻松导入数据(不确定Calc是否有列限制,但excel 2007可以容纳16384列)并通过该程序查看它?

你需要在一张桌子上查看多行吗?

我的猜测是这个数据是数字的,有没有什么方法可以将单行数据显示为20 * 50网格或类似的东西,然后只是通过行分页?

例如,第1行,第1列=数据库的第1列,第2行,第1列=数据库的第21列等

 Id = 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ----|-------------------------------------------------------- 0 | 20 | 40 | 60 | 80 | 100 | 120 | etc | 

尝试使用非常小的字体的html表

如果你担心格式化表使用CSS:

 td { font-size: 0.2em; text-align: right; } 

或者,如果你的所有数字都是相同的大小,你也可以生成一个“数字墙”显示,例如使用固定宽度的字体并在滚动面板中显示5个字符宽的列

这取决于它需要多么漂亮。 如果这只是一个调试/点检查工具,你可以并排放置几个DataGrids,每个DataGrids显示一列选择。 会有点丑,但是可​​行的。

OTOH,如果你需要一个半抛光工具,你可能想要一个自定义控件来处理它。 基本上,您将使用一些缓冲区加载正在查看的数据库部分,当用户滚动当前加载的数据时,运行新查询。

DataGrid(甚至是ListView)应该能够处理一个包含32列和32行的表,这样您就可以一次显示整个数据库行的数据。 这将允许您立即查看某些单元格是否缺少数据。

即使提出这个问题我也觉得很脏,但你可以做一些事情:

 SELECT Field1 + ' - ' + Field2 + ... AS EvilMegaColumn FROM Table 

但实际上我认为这属于“如果你遇到这个限制,你做错了什么”的类别。 我真的看不出任何理由,速度或其他需要1000列……

谁会读1000列表??? 试着想办法过滤或可视化数据。

也许你应该研究一种不同类型的数据库。 我听说面向列的数据库很适合这种事情(而典型的RDBMS是面向行的)。 此外,如果您在第一次插入后不再返回更新行,那么二进制平面文件可能比巨型表更好吗?

我会把它作为深入研究。 在第一页(或页面顶部),您将拥有选择行的控件。 在下一页(或页面底部)中,您将显示所选行中的数据。 根据所需的单元格宽度,您可以将此操作分为100行10列,或1000行1列。

这可以很容易地做为动态客户端javascript – 您甚至可以通过这种方式使其可编辑。 我不确定这在C#中是如何工作的。

如果您刚刚进行validation,则无法以编程方式检查每个字段并报告整行是正常的! 然后你需要一个非常简单的数据网格,列出不太好的行。

然后可以通过您可以应用于单行的任何技术来检查它们,因为在大多数情况下您不需要浏览字段。 我在这里假设您可以以某种方式查看整行,并且正在寻找同时浏览多行以查找缺失数据的方法(自动化这将使其更加可靠)。

从一个倾斜的角度来看,我会问用户是否需要一次“加载”所有列?

如果用户愿意一次显示一列子列(例如,一次显示100个列,或者一次显示一个特定的列),那么我将使用某种数据网格(内置的一个或一个ListView,或者可能是第三方)显示子集,CheckedListView停靠在一边,允许显示感兴趣的子集。

或者,您是否可以显示某种摘要数据,显示100列组的计数/平均值/ xxx?

我建议调查除平面布局之外的其他东西。 根据我的经验,数据库对列数和行字节大小有限制。

  • 您的SQL可能允许定义1000列。
  • SQL行不能超过行字节限制。

每个数据库实现都有一个页面大小(4k / 8k),并且单行必须符合此数据大小。 NULL通常是免费赠品。 这意味着1000英寸1000 x 4字节将适合4k页面大小。

如果你正在与varchars谈论数据,那么问题就更糟了。 每列中有多少个字符? 可以填写多少列? 如果平均有10个字符,并且页面大小为8k,那么您将丢失带有SQL错误的数据。

如果你必须笑,但这种情况确实发生在一个特别长的蜿蜒打字员在一个平坦的数据表中,我知道正在推动极限。

..validation数据是否真正进入那里。

可能它已经过时了,但您可以使用像素图,其中单个像素表示表格的单个单元格(屏幕大于1000)或单个像素表示10个单元格,单击缩放区域。

像素的颜色将取决于数据。 对于空/数据,它可以是黑/白。 或者它可能是颜色显示值随着每一行增长或减少。 或者红色表示突然跳转数据。 您可以在数据网格中正常捕捉所有exception情况。

然后您需要的是捕获感兴趣区域中的点击坐标,并使用小表来显示表格的一部分而不进行任何滚动。

只需单击即可返回像素图。

鉴于用户无论如何都必须水平滚动,您可以使用显示合理数量的列(例如,50)的常规数据网格。 然后,您在网格下方有一个水平滚动条,用于选择要显示的列的子集。 当滚动条位于左侧时,您会显示1-50列,当您单击右箭头时,您会转到2-51,等等。

这为您提供了滚动function,而无需使用数据重载网格控件。 虽然您将失去在表格中自由光标或进行大矩形选择的能力,但听起来不会是这个应用程序的问题。

有多少数据对初始视图至关重要? 我可以看到做类似主/细节类型网格的事情,你将关键列(比如10)放到数据网格上,当用户点击查看详细信息时,你可以取剩下的列并将它们显示在“物业区“或在这方面的东西。

如果您只需确保填充数据,那么为什么不让每个列都具有默认值,例如’void’,’blank’等。

然后,您可以迭代计数非默认值/总计以显示百分比。

现在,您可以使用百分比值可视化数据完整性,甚至可以记录哪些列具有默认值(如列表/数组)以供进一步调查。

您可以考虑与您的用户群一起检查并查看他们真正需要查看的内容,然后为每个不同的需求设置视图,以便减少列数。

另一个选择是读取数据,并从中创建一个高大的静态html页面集。 然后,您可以从程序中调用浏览器来查看它。

有一个可滚动的窗格并一次显示10列(这些列可以主动加载或缓存,或者您需要的任何内容)。 向左滚动时,显示前十个。 向右滚动时,显示后面的列序列。 总而言之,在任何给定点上只有10列有效。 在我看来,尝试实际显示1000列将是任何其他方式。 PS:这只不过是一个理想的猜测; 我不确定它是否可以远程实现。