将表格格式化为C#中的文本输出

时间:2018-09-25 14:53:44

标签: c# sql text output tabular

我在C#中有一个查询与一个SQL数据库。从这个查询中,我得到一个像这样的列表:

List<List<string>>()

如果需要,此列表可以更改为任何其他表类型。

在Microsoft Server Management Studio中,它看起来像这样:

enter image description here

在Microsoft SQL Server Management Studio中,您可以简单地将结果输出为文本,如下所示:

enter image description here

现在,当我自动化一些任务时,我将使用C#而不是手动使用MSSQL。由于GXP环境,将数据库中的每个数据更改单独记录下来并在“票证”上附加文本报告非常重要。

目前,我使用表文本生成的查询如下:

SqlCommand command = new SqlCommand("SELECT '" + description + "' AS '" + description + "', CPPS_Site,Study_Id,CustNo,CPPS_Job FROM CDS.dbo.Studies " +
                                            "WHERE Study_Id = " + studyID, con);
List<string> overview = new List<string>();

overview.Add("|=========================================================|");
overview.Add("|"+description + "\t|CPPS_Site\t|Study_ID\t|CustNo\t|CPPS_Job|");
overview.Add("|---------------------------------------------------------|");
using (SqlDataReader resultQuery = command.ExecuteReader())
{
    var schemaTable = resultQuery.GetSchemaTable();
    while (resultQuery.Read())
    {
        string build = "|";
        build +=  resultQuery.GetSqlValue(0) + "\t|"
              + resultQuery.GetSqlValue(1) + "\t\t|"
              + resultQuery.GetSqlValue(2) + "\t\t|"
              + resultQuery.GetSqlValue(3) + "\t|"
              + resultQuery.GetSqlValue(4);
        build += "|";
        overview.Add(build);
     }
overview.Add("|=========================================================|");
     return overview;
 }

结果:

enter image description here

虽然这在技术上是可行的,也将被接受,但我个人对此非常丑陋的解决方案感到不满意。例如,对于不同长度的字符串,格式将不再适合。您知道更干净的解决方案吗?

1 个答案:

答案 0 :(得分:2)

Composite string formatting提供了一个匹配组件,可用于指定字段大小并向左或向右对齐值。例如

String.Format("|{0,5}",5);

会产生

|    5|

每行都可以写成:

var linePattern="|{0,-7}|{1,-17}|{2,-11}|{3,-14}|{4,-8}|";
var line= String.Format(linePattern
    resultQuery.GetSqlValue(0),
    resultQuery.GetSqlValue(1),
    resultQuery.GetSqlValue(2),
    resultQuery.GetSqlValue(3),
    resultQuery.GetSqlValue(4));

可以使用相同的模式写标头:

var header=String.Format(linePattern,"Before","CPPS_Site","Study_ID","CustNo","CPPS_Job");

将标题和行都写到控制台将如下所示:

|Before |CPPS_Site        |Study_ID   |CustNo        |CPPS_Job|
|Before |1                |2          |C50030        |999     |

但是,如果字符串大于字段值,它们将不会被截断并且格式将显示为残破,例如:

|Before |CPPS_Site        |Study_ID   |CustNo        |CPPS_Job|
|Before123 |1                |2          |C50030        |999     |