查看表中带* *地段列的最好方法? [英] Best way to view a table with *lots* of columns?

查看:127
本文介绍了查看表中带* *地段列的最好方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

目前被downmodded的危险,我要问什么是最好的机制(最好是实践违反固有这里显然是主观的)从表中查看数据,使用C#,用的很多的列。受到了很多,我的意思是像1000。

At the risk of being downmodded, I want to ask what the best mechanism (best is obviously subjective for the practice violation inherent here) for viewing data from a table, using C#, with a lot of columns. By a lot, I mean something like 1000.

现在你之前的所有点击快乐,或扔掉像究竟为什么你会永远有一个表的反应多列让我说,它实际上是一个设计要求的一部分。我们正在以最快的速度,我们可以从1000个数据点收集数据。我们需要存储这些尽可能快,因此平表。该数据需要从SQL Server,因此数据库(我们使用SQL契约表直)。

Now before you get all click happy, or throw out responses like "why the hell would you ever have a table with that many columns" let me say that it's actually part of a design requirement. We are collecting data as fast as we can from 1000 data points. We need to store these as fast as possible, hence the flat table. The data needs to be directly accessible from SQL Server, hence the database (we're using SQL Compact with table-direct).

因此,让我们忘了,现在,所有的直接访问我们已经了解了正确的数据库设计,规范化的规则等,并只专注于一个事实,即我有1000列的表,我希望能够在屏幕上显示的数据验证数据实际上是打算在那里。

So let's forget, for now, all that we've learned about proper database design, the rules of normalization, etc. and just focus on the fact that I have a table with 1000 columns and I want to be able to display the data on screen to verify that the data is actually going in there.

我已经尝试了数据网格。它pukes因为(这并不奇怪),它不是设计来处理很多列。

I've tried a data grid. It pukes because (not surprisingly) it's not designed to handle that many columns.

我已经使用在Studio观众尝试。它pukes 256后,再加上最终用户没有安装无论如何工作室。

I've tried using the viewer in Studio. It pukes after 256, plus the end user won't have Studio installed anyway.

对于现在的结果不一定是漂亮,但不一定是更新的,也不。必须对数据的变化敏感 - 在给定时间点在表中的数据只是静态快照

For now the result need not be pretty, it need not be updateable, nor does it need to be sensitive to data changes - just a static snapshot of data in the table at a given point in time.

相关(或半有关)信息:

Relevant (or semi-relevant) info:


  • 表有1000列(获得点击快乐过上述读)

  • 使用SQL精简版本3.5

  • 运行在桌面上

  • 寻找托管代码的答案

  • Table has 1000 columns (read above before getting click happy)
  • Using SQL Compact version 3.5
  • Running on the desktop
  • Looking for a managed-code answer

推荐答案

好吧,什么结果对我来说是正确的答案是使用的ReportViewer控制,但不是在MSDN中记载的任何方式。问题是,我有动态数据,所以我需要一个动态的报告,和所有的教程等似乎假设你有认识在设计时一切的奢华,所以你可以指向和点击通过向导你的方式。

Ok, what turned out to be the right answer for me was to use the ReportViewer control, but not in any manner documented in MSDN. The problem is that I have dynamic data, so I need a dynamic report, and all of the tutorials, etc. seem to assume you have the luxury of knowing everything at design time so you can point and click your way through a Wizard.

解决方案最终需要对夫妇件。首先,我要创建代码,以动态生成RDLC了的ReportViewer用来形容报告的布局和哪些数据字段映射到什么。这是我想出了:

The solution ended up requiring a couple pieces. First, I had to create code to dynamically generate the RDLC that the ReportViewer uses to describe the report layout and what data fields map to what. This is what I came up with:

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;
  }
}



第二件是,我花了正确的XSL文件 Shipe的博客的。该RDLC代码有很值钱,因为它是所有预期的Web应用,但XSL是纯金的。我已经把它在这个帖子底部的完整性在博客不断脱机情况下。

The second piece is an XSL file that I took right off of Dan Shipe's blog. The RDLC code there was pretty worthless as it was all intended for Web use, but the XSL is pure gold. I've put it at the bottom of this post for completeness in case that blog ever goes offline.

有一次,我有这两个片,它只是创造的问题上有一个ReportViewer控件形式,然后利用这段代码来设置它:

Once I has those two pieces, it was simply a matter of creating a Form with a ReportViewer control on it, then using this bit of code to set it up:

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对象要显示的

The key here is that 'ds' is a DataSet object with a single DataTable in it with the data to be displayed.

再次完整性,这里的XSL - 大小约惋惜:

Again, for completeness, here's the XSL - sorry about the size:

	<?xml version="1.0"?>
	<!-- Stylesheet for creating ReportViewer RDLC documents -->
	<xsl:stylesheet version="1.0"
	  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
	  xmlns:xs="http://www.w3.org/2001/XMLSchema"
	  xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
	  xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"  xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition"
	  >

	 <xsl:variable name="mvarName" select="/xs:schema/@Name"/>
	 <xsl:variable name="mvarFontSize">8pt</xsl:variable>
	 <xsl:variable name="mvarFontWeight">500</xsl:variable>
	 <xsl:variable name="mvarFontWeightBold">700</xsl:variable>


	 <xsl:template match="/">
	  <xsl:apply-templates select="/xs:schema/xs:element/xs:complexType/xs:choice/xs:element/xs:complexType/xs:sequence">
	  </xsl:apply-templates>
	 </xsl:template>

	 <xsl:template match="xs:sequence">
	  <Report xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition">
	   <BottomMargin>1in</BottomMargin>
	   <RightMargin>1in</RightMargin>
	   <LeftMargin>1in</LeftMargin>
	   <TopMargin>1in</TopMargin>
	   <InteractiveHeight>11in</InteractiveHeight>
	   <InteractiveWidth>8.5in</InteractiveWidth>
	   <Width>6.5in</Width>
	   <Language>en-US</Language>
	   <rd:DrawGrid>true</rd:DrawGrid>
	   <rd:SnapToGrid>true</rd:SnapToGrid>
	   <rd:ReportID>7358b654-3ca3-44a0-8677-efe0a55c7c45</rd:ReportID>

	   <xsl:call-template name="BuildDataSource">
	   </xsl:call-template>

	   <xsl:call-template name="BuildDataSet">
	   </xsl:call-template>

	   <Body>
	    <Height>0.50in</Height>
	    <ReportItems>
	     <Table Name="table1">
	      <DataSetName><xsl:value-of select="$mvarName" /></DataSetName>
	      <Top>0.5in</Top>
	      <Height>0.50in</Height>
	      <Header>
	       <TableRows>
	        <TableRow>
	         <Height>0.25in</Height>
	         <TableCells>

	          <xsl:apply-templates select="xs:element" mode="HeaderTableCell">
	          </xsl:apply-templates>

	         </TableCells>
	        </TableRow>
	       </TableRows>
	      </Header>
	      <Details>
	       <TableRows>
	        <TableRow>
	         <Height>0.25in</Height>
	         <TableCells>

	          <xsl:apply-templates select="xs:element" mode="DetailTableCell">
	          </xsl:apply-templates>

	         </TableCells>
	        </TableRow>
	       </TableRows>
	      </Details>
	      <TableColumns>

	       <xsl:apply-templates select="xs:element" mode="TableColumn">
	       </xsl:apply-templates>

	      </TableColumns>
	     </Table>
	    </ReportItems>
	   </Body>
	  </Report>
	 </xsl:template>

	 <xsl:template name="BuildDataSource">
	  <DataSources>
	   <DataSource Name="DummyDataSource">
	    <ConnectionProperties>
	     <ConnectString/>
	     <DataProvider>SQL</DataProvider>
	    </ConnectionProperties>
	    <rd:DataSourceID>84635ff8-d177-4a25-9aa5-5a921652c79c</rd:DataSourceID>
	   </DataSource>
	  </DataSources>
	 </xsl:template>

	 <xsl:template name="BuildDataSet">
	  <DataSets>
	   <DataSet Name="{$mvarName}">
	    <Query>
	     <rd:UseGenericDesigner>true</rd:UseGenericDesigner>
	     <CommandText/>
	     <DataSourceName>DummyDataSource</DataSourceName>
	    </Query>
	    <Fields>

	     <xsl:apply-templates select="xs:element" mode="Field">
	     </xsl:apply-templates>

	    </Fields>
	   </DataSet>
	  </DataSets>
	 </xsl:template>

	 <xsl:template match="xs:element" mode="Field">
	  <xsl:variable name="varFieldName"> 
	   <xsl:value-of select="@name" />
	  </xsl:variable>

	  <xsl:variable name="varDataType">
	   <xsl:choose>
	    <xsl:when test="@type='xs:int'">System.Int32</xsl:when>
	    <xsl:when test="@type='xs:string'">System.String</xsl:when>
	    <xsl:when test="@type='xs:dateTime'">System.DateTime</xsl:when>
	    <xsl:when test="@type='xs:boolean'">System.Boolean</xsl:when>
	   </xsl:choose>
	  </xsl:variable>

	  <Field Name="{$varFieldName}">
	   <rd:TypeName><xsl:value-of select="$varDataType"/></rd:TypeName>
	   <DataField><xsl:value-of select="$varFieldName"/></DataField>
	  </Field>
	 </xsl:template>

	 <xsl:template match="xs:element" mode="HeaderTableCell">
	  <xsl:variable name="varFieldName"> 
	   <xsl:value-of select="@name" />
	  </xsl:variable>

	  <TableCell>
	   <ReportItems>
	    <Textbox Name="textbox{position()}">
	     <rd:DefaultName>textbox<xsl:value-of select="position()"/>
	     </rd:DefaultName>
	     <Value><xsl:value-of select="$varFieldName"/></Value>
	     <CanGrow>true</CanGrow>
	     <ZIndex>7</ZIndex>
	     <Style>
	      <TextAlign>Center</TextAlign>
	      <PaddingLeft>2pt</PaddingLeft>
	      <PaddingBottom>2pt</PaddingBottom>
	      <PaddingRight>2pt</PaddingRight>
	      <PaddingTop>2pt</PaddingTop>
	      <FontSize><xsl:value-of select="$mvarFontSize"/></FontSize> 
	      <FontWeight><xsl:value-of select="$mvarFontWeightBold"/></FontWeight> 
	      <BackgroundColor>#000000</BackgroundColor> 
	      <Color>#ffffff</Color>
	      <BorderColor>
	       <Default>#ffffff</Default>
	      </BorderColor>
	      <BorderStyle>
	       <Default>Solid</Default>
	      </BorderStyle>
	     </Style>
	    </Textbox>
	   </ReportItems>
	  </TableCell>
	 </xsl:template>

	 <xsl:template match="xs:element" mode="DetailTableCell">
	  <xsl:variable name="varFieldName"> 
	   <xsl:value-of select="@name" />
	  </xsl:variable>

	  <TableCell>
	   <ReportItems>
	    <Textbox Name="{$varFieldName}">
	     <rd:DefaultName><xsl:value-of select="$varFieldName"/></rd:DefaultName>
	     <Value>=Fields!<xsl:value-of select="$varFieldName"/>.Value</Value>
	     <CanGrow>true</CanGrow>
	     <ZIndex>7</ZIndex>
	     <Style>
	      <TextAlign>Left</TextAlign>
	      <PaddingLeft>2pt</PaddingLeft>
	      <PaddingBottom>2pt</PaddingBottom>
	      <PaddingRight>2pt</PaddingRight>
	      <PaddingTop>2pt</PaddingTop>
	      <FontSize><xsl:value-of select="$mvarFontSize"/></FontSize> 
	      <FontWeight><xsl:value-of select="$mvarFontWeight"/></FontWeight> 
	      <BackgroundColor>#e0e0e0</BackgroundColor> 
	      <Color>#000000</Color> 
	      <BorderColor>
	       <Default>#ffffff</Default> 
	      </BorderColor>
	      <BorderStyle>
	        <Default>Solid</Default>
	      </BorderStyle>
	     </Style>
	    </Textbox>
	   </ReportItems>
	  </TableCell>
	 </xsl:template>

	 <xsl:template match="xs:element" mode="TableColumn">
	  <TableColumn>
	   <Width>0.75in</Width>
	  </TableColumn>
	 </xsl:template>

	 <xsl:template name="replace-string">
	  <xsl:param name="text"/>
	  <xsl:param name="from"/>
	  <xsl:param name="to"/>
	  <xsl:choose>
	   <xsl:when test="contains($text, $from)">
	    <xsl:variable name="before" select="substring-before($text, $from)"/>
	    <xsl:variable name="after" select="substring-after($text, $from)"/>
	    <xsl:variable name="prefix" select="concat($before, $to)"/>
	    <xsl:value-of select="$before"/>
	    <xsl:value-of select="$to"/>
	    <xsl:call-template name="replace-string">
	     <xsl:with-param name="text" select="$after"/>
	     <xsl:with-param name="from" select="$from"/>
	     <xsl:with-param name="to" select="$to"/>
	    </xsl:call-template>
	   </xsl:when>
	   <xsl:otherwise>
	    <xsl:value-of select="$text"/>
	   </xsl:otherwise>
	  </xsl:choose>
	 </xsl:template>
	</xsl:stylesheet>

这篇关于查看表中带* *地段列的最好方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆