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

C# 从SQL Server读取数据并对其进行格式化,c#,sql,sql-server,C#,Sql,Sql Server,我有一个SQL Server数据库,表QC和列a、B、C、D、E, 评论 我试图做的是从列中读取数据并将其显示在标签中。但并非所有列中都有数据 预期产出为: 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.Exe

我有一个SQL Server数据库,表QC和列a、B、C、D、E, 评论

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

预期产出为:

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;

正如Mong Zhu指出的,在读取列值时检查:

if (!string.IsNullOrEmpty(reader.GetString("A")))
这将测试每一列的空值,并将其替换为空字符串

要避免结尾出现悬空分隔符,请使用您要连接的字符串数组

然而,它似乎没有告诉列A、B等的实际数据类型,并且假设它们是字符串/字符数据类型,结果是错误的


根据您的实际数据类型,您必须将筛选Linq查询编辑为实际类型,如qc.OfType,或仅对空值(如qc.Wherev=>)进行筛选!v是DBNull。

您可以在查询中执行此操作。基本上,您需要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

谢谢大家帮助我,解决了我的问题。这是适用于我的代码:

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();

再次感谢您。

如果没有数据,请不要将其连接起来。您可以通过string.IsNullOrWhiteSpacereader[C].ToString==True对其进行测试一些建议:将数据访问代码与表示逻辑分开。因为它看起来像是在构建一个web应用程序,所以只需将结果放在一个集合数据表中,并将其绑定到某个repeater控件进行显示,而不是像ASP经典时代那样连接输出html;当我添加它时,我得到的只有错误的赋值、调用、递增、递减、等待,新的对象表达式可以用作语句Filburt,我是新手。我不知道你在说什么。是的,我正在尝试构建web app.Filburt,第二种方法是删除我需要使用的分隔符。有没有其他方法来添加分隔符|?这就是工作,但输出不是我想要的。它看起来是这样的:2.5 | 2.3 |如果我把它放在A、B和D列中,它看起来是这样的:2.5 | 2.3 | 2.2 |我需要的输出是:2.5 | 2.3 |如果A和B中有,但是如果D中有,比如:2.5 | 2.3 | 2.2.2有热的方法吗?@Filburt sdr是什么?它是什么样的变量之王?很抱歉,它进行了这么多的编辑-看起来我一次优化了太多。@Filburt我得到了错误System.InvalidCastException:“无法将类型为'System.Int32'的对象强制转换为类型为'System.String'。这里:qc[I]=reader.GetStringi@费尔伯特。不,没有。据我所知,这是在SQL Server中实现concat_ws最方便的方法。@Filburt。当然会的。这就是为什么那些东西把它拿走了。天啊,对我来说肯定太晚了——我完全忽略了那些东西。
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();