从SQL Server读取数据并对其进行格式化

时间:2019-03-09 21:10:37

标签: c# sql sql-server

我有一个SQL Server数据库,其中包含表QC和列A, B, C, D, E, Comment

我想做的是从列中读取数据并将其显示在标签中。但是并非所有列中都总是有数据。

预期输出为:

2.5|2.1

如果仅在A和B列中有数据。但我得到:

2.5|2.1| |||||

这是我的代码:

SqlCommand cmd = new SqlCommand("SELECT TOP 1 * FROM [TableQC] ORDER BY id DESC", conn);
SqlDataReader reader = cmd.ExecuteReader();

string temp = "";
string temp1 = "";

while (reader.Read())
{
    temp += reader["A"].ToString() + "|";
    temp += reader["B"].ToString() + "|";
    temp += reader["C"].ToString() + "|";
    temp += reader["D"].ToString() + "|";
    temp += reader["E"].ToString() + "|";
    temp1 += reader["Comment"].ToString();
    //temp += "<br/>";
}
conn.Close();

label1.Text = temp;
label2.Text = temp1;

3 个答案:

答案 0 :(得分:1)

正如Mong Zhu指出的那样,请在读取列值时进行检查:

if (!string.IsNullOrEmpty(reader.GetString("A")))

这将测试每列的空值并将其替换为空字符串。

为避免在结尾使用悬空的|分隔符,请使用Join()

的字符串数组
while (reader.Read())
{
    // create an array big enough to hold all columns
    object[] qc = new object[reader.FieldCount];

    // iterate over all columns of your reader
    for (int i = 0; i < reader.FieldCount; i++)
    {
        if (reader[i] == reader["Comment"])
        {
            label2.Text = reader.GetSqlString(i).IsNull ? null : reader.GetSqlString(i).Value;
        }
        else
        {
            // add to array
            qc[i] = reader.GetValue(i);
        }
    }

    label1.Text = string.Join("|", qc.OfType<string>());
}

但是,似乎并没有说出A,B等列的实际数据类型,并假设它们是字符串/字符数据类型,结果却是错误的。

根据您的实际数据类型,您将必须将过滤的Linq查询编辑为实际类型,例如qc.OfType<decimal>(),或者仅过滤空值(例如qc.Where(v => !(v is DBNull))。)

答案 1 :(得分:1)

您可以在查询中执行此操作。基本上,您需要concat_ws(),但是在SQL Server中不可用。相反:

SELECT TOP 1 STUFF( (COALESCE('|' + A, '') +
                     COALESCE('|' + B, '') +
                     COALESCE('|' + C, '') +
                     COALESCE('|' + D, '') +
                     COALESCE('|' + E, '') +
                     COALESCE('|' + Comment, '')
                    ), 1, 1, ''
                  ) as abcde

FROM [TableQC]
ORDER BY id DESC

答案 2 :(得分:0)

感谢大家为我提供帮助并解决了我的问题。这是对我有用的代码:

SqlCommand cmd = new SqlCommand("SELECT TOP 1 * FROM [TableQC] ORDER BY id DESC", conn);
SqlDataReader reader = cmd.ExecuteReader();

while (reader.Read())
{
    // create an array big enough to hold all columns
    object[] qc = new object[reader.FieldCount];

    // iterate over all columns of your reader
    for (int i = 0; i < reader.FieldCount; i++)
    {
        if (reader[i] == reader["Comment"])
        {
            lblMessage1.Text = reader.GetSqlString(i).IsNull ? null : reader.GetSqlString(i).Value;
        }
        else
        {
            // add to array
            qc[i] = reader.GetValue(i);
        }
    }

    lblMessage.Text = string.Join("|", qc.OfType<double>());
}

conn.Close();

再次感谢您。