C# SqlDataReader возвращает только значения › 0

Это беспокоило меня в течение последних нескольких часов, и я не могу найти ответ.

У меня есть следующий запрос

SELECT        A, SUM(B) AS total
FROM          table
GROUP BY      A

теперь столбец B в таблице может содержать только 0 или 1. а A - total1, total2 или total3.

теперь, когда я использую это непосредственно в базе данных SQL, я получаю хорошую таблицу, содержащую

A        total
total1   1
total2   0
toatl3   5

Это именно то, что я хочу сделать. Однако при использовании в моей программе С#. если один из итогов равен 0, он вообще не отображается. Ниже приведен код, который я использую, но он работает нормально, только когда total1, total2 и total3 больше 0, поэтому в приведенной выше таблице будут отображаться только total1 и total3.. .

string total = "A        total";       
SqlConnection conn = new SqlConnection("connection string goes here I know");
try
{
    conn.Open();
    SqlCommand total = new SqlCommand(
        "SELECT A, SUM(B) AS total FROM table GROUP BY A", conn);

    SqlDataReader total_reader = total.ExecuteReader();
    while (total_reader.Read())
    {
        total += total_reader["A"].ToString() + "  " + total_reader["total"] + "\n";
    }
}
catch (Exception err)
{
    serverstats += err.ToString();
}
finally
{
    conn.Close();
}

Как мне сделать так, чтобы он правильно отображал таблицу, даже если total1, total2 и total3 равны 0

таким образом отображая:

A        total
total1   0
total2   0
toatl3   0

Я знаю, что 0 в SQL обычно равно нулю и тому подобное.

Я подозреваю, что это причина того, что C# предполагает, что если значение равно 0, оно не представляет интереса.

Надеюсь, я объяснил это достаточно правильно, спасибо за любую помощь заранее!

======= РЕДАКТИРОВАТЬ ======

COALESCE или ISNULL не имеет значения :(

Я предполагаю, что это связано с битом чтения С#, а не с битом запроса SQL.

Как вы можете видеть в моем примере, бит SQL создает таблицу с правильными строками и не записывает их как NULL. Но бит С#, похоже, читает его как NULL.


person Raskaroth    schedule 02.04.2011    source источник
comment
Я сомневаюсь, что это решит проблему, но пробовали ли вы вызывать ToString() для total_reader[total]?   -  person SquidScareMe    schedule 02.04.2011
comment
@SquidScareMe ToString() уже вызывается автоматически.   -  person OJ.    schedule 02.04.2011
comment
Какой тип данных B? Это битовое поле?   -  person Naraen    schedule 02.04.2011
comment
Пожалуйста, не ловите System.Exception   -  person Guillaume Massé    schedule 13.07.2011


Ответы (3)


Если столбец B может иметь нули, попробуйте

SELECT        A, COALESCE(SUM(B),0) AS total
FROM          table
GROUP BY      A
person Bala R    schedule 02.04.2011
comment
Разве вы не должны суммировать (объединять (b, 0))? - person JoshRoss; 02.04.2011
comment
Спасибо, но я это уже пробовал. а также ISNULL. Я предполагаю, что бит С# SqlDataReader виноват в чтении 0 как NULL-дороги - person Raskaroth; 02.04.2011

какую базу данных sql вы используете? сервер sql или mysql?

или попробуйте отредактировать строку:

total += total_reader["A"].ToString() + " " + total_reader["total"] + "\n";

to

total += total_reader["A"].ToString() + " " + int.Parse(total_reader["total"].ToString()) + "\n";

person ysrb    schedule 02.04.2011

Хорошо получается, что у меня было ГДЕ (B = 1)

Я забыл убрать это из своего SQL-запроса.

Спасибо за помощь :)

person Raskaroth    schedule 02.04.2011