【问题标题】:How do I create or mimic SQL Server Management Studio query results report如何创建或模仿 SQL Server Management Studio 查询结果报告
【发布时间】:2014-03-17 08:39:58
【问题描述】:

在 SQL Server 管理工作室中,您可以将查询结果输出到网格(默认设置),这样当您运行查询时,查询结果会直接显示在其下方。或者,您可以将查询结果输出到一个文件,该文件会在您喜欢的任何位置生成一个 .RPT 文件。

报告文件看起来像这样(在记事本中打开时);

我的问题是,如何在 .NET(我使用的是 VB.Net)中创建相同类型的文件(相同的文件格式、间距等)。

这是我目前使用的企业库,但它返回一个数据集,我从中提取一个数据视图。我可以将数据视图转换为文本文件,但是那个文本文件看起来不像这个报告文件,我什至不知道它的格式是如何决定的。

`Dim dbCommandWrapper As DBCommandWrapper

            dbCommandWrapper = GlobalDatabase.objDatabase.GetStoredProcCommandWrapper("My_StoredProcedure_Report")

            If IsNothing(objGlobalDatabase.objTransaction) Then
                Return GlobalDatabase.objDatabase.ExecuteDataSet(dbCommandWrapper).Tables(0).DefaultView()
            Else
                Return GlobalDatabase.objDatabase.ExecuteDataSet(dbCommandWrapper, objGlobalDatabase.objTransaction).Tables(0).DefaultView()
            End If`

【问题讨论】:

    标签: sql .net vb.net sql-server-2008 enterprise-library


    【解决方案1】:

    管理结果视图只不过是格式化的文本。你需要收到DataTable,然后

    dim columns as new Dictionary(of int, int) ' save col index / col width info
    for i as integer = 0 to DataTable.Columns.count - 1
        columns.Add(i, 1)
    next
    
    dim data as new List(of List(of string))
    
    ' preload you values and calculate width
    For rows as int = 0 to DataTable.Rows.Count-1
    
        for cols as integer = 0 to DataTable.Columns.Count - 1
    
            dim cl as new List(of string) ' Save your string values here
            if not isDbnull(DataTable.Rows(rows)(cols)) Then
                dim val as string = convert.toString()(DataTable.Rows(rows)(cols))
                if val.Length > columns(cols) Then 
                    columns(cols) = val.Length 
                end if
                cl.Add(val)
            else
                cl.Add(string.empty)
            end if    
        next
        data.Add(cl)
    next
    

    现在,打印你的输出

    dim sb as new StringBuilder()
    
    ' Do the header
    for i as integer = 0 to Datatable.Columns.count -1
        sb.Append(Datatable.Columns(i).ColumnName.PadRight(columns(i), "_"))
        sb.Append(" ") ' space between columns 
    next
    sb.Append(Environment.NewLine)
    
    ' Now Data
    for each l as list(of list(of string)) in data
        for i as integer = 0 to l.count
            sb.Append(l(i).Padright(columns(i)))
            sb.Append(" ") ' space between columns 
        next
        sb.Append(Environment.NewLine)
    next        
    

    现在您有了带有数据的 sb 对象。您现在需要的是使用某种字体显示它,其中每个字符占用相同的宽度,例如Courier New

    警告:代码从内存中输入并经过 nit 检查,但应该代表您正在寻找的内容

    【讨论】:

    • 感谢您的回复。但是,sql server management studio 生成的报告似乎根据数据库列的最大大小设置列宽,而不是在该列中检索到的最长元素。此外,仅当该长度长于列名标题的长度时,这才是正确的。鉴于这两件事,我将如何适当地设置列大小?
    • @n00b 使用我提供的代码很容易改变输出。您可以使用 ado.net 分两个阶段加载数据表 - 首先是模式;第二,数据。然后,您可以将标题设置为 ...ColumnName.PadRightdt(Datatable.Columns(i).MaxLength, "_") 而不是 ...ColumnName.PadRight(columns(i), "_") 用于字符串。对于数字,您可以使用 fixrd 宽度或将其从数据类型 ...ColumnName.PadRightdt(int.MaxValue.ToString(), "_") 中取出。如果您愿意,可以从 INFORMATION_SCHEMA 获取此信息。我的代码是向您展示方式,但您必须注意您想要拥有的细节。插入任何东西
    • 谢谢,您的回答让我成功了一半,但它仍然与 SQL Server“结果文件”文件的格式不同。我需要该文件来匹配存储过程模式的格式。 +1 为您提供帮助。请参阅我关于如何使用企业库获取架构的后续问题stackoverflow.com/questions/21939841/…
    猜你喜欢
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    相关资源
    最近更新 更多