Справочные данные в SQLDataReader по столбцам и строкам или любой другой альтернативе - PullRequest
2 голосов
/ 26 января 2012

Я выполняю хранимую процедуру, и в результате получается такой формат

+------+--------+-----+-------+
|  ID  | Resign | Sum | Count |
+------+--------+-----+-------+
| 1234 |      0 | 400 |     3 |
| 1234 |      1 | 800 |     4 |
+------+--------+-----+-------+

Я пытался использовать этот код для ссылки на значения, возвращаемые запросом, но, похоже, он работает не так, как я хочу

if (conn.State != ConnectionState.Open)
    conn.Open();
    SqlCommand sc = new SqlCommand();
    sc.CommandText = "usp_GetResignPool";
    sc.CommandType = CommandType.StoredProcedure;
    sc.Connection = conn;
    sc.Parameters.Add(AddParam(EndDate, "@EndDate"));
    sc.Parameters.Add(AddParam(am_id, "@id"));

    SqlDataReader reader;
    reader = sc.ExecuteReader();

 while (reader.Read())
            {
                if reader. // lost here
            }

Как я могу сделать что-то подобное.↓

int resigned = 0, resign_count = 0, not_resigned = 0, notresign_count =0;

if (read["Resigned"] == 1)
{
    resigned = read["sum"];
    resign_count = read["count"];
}
else
{
    not_resigned = read["sum"];
    notresign_count = read["count"]; 
}           

Неважно, что я использовал SQLDataReader.

Редактировать: реальные имена столбцов

ID        Resigned    sum                    count
--------- ----------- ---------------------- -----------

Ответы [ 3 ]

3 голосов
/ 26 января 2012

Это не сработало, потому что в вашей таблице нет столбца с именем "Resigned", как у вас, когда вы работаете с SqlDataReader.

РЕДАКТИРОВАТЬ : Я думаю, что корень проблемы в том, как вы добавляете параметры. AddParam() - это не тот метод, который вы хотите использовать. Следовательно, ваш набор результатов, вероятно, пуст.

....

SqlCommand sc = new SqlCommand(); 
sc.CommandText = "usp_GetResignPool"; 
sc.CommandType = CommandType.StoredProcedure; 
sc.Connection = conn; 
sc.Parameters.AddWithValue("@EndDate", EndDate);
sc.Parameters.AddWithValue("id", am_id);

SqlDataReader reader; 
reader = sc.ExecuteReader(); 

using (reader = sc.ExecuteReader())
{
    while (reader.Read())
    {
        if (Convert.ToInt32(read["Resign"]) == 1)   
        {   
            resigned = Convert.ToInt32(read["Sum"]);   
            resign_count = Convert.ToInt32(read["Count"]);   
        }   
        else   
        {   
            not_resigned = Convert.ToInt32(read["Sum"]);   
            notresign_count = Convert.ToInt32(read["Count"]);    
        } 
    }
}

Обратите внимание, как я изменил индикатор элемента на "Resign". Это должно соответствовать столбцу, который возвращается в вашем наборе данных. Или вы можете использовать номер столбца, чтобы получить это, например, так:

        if (Convert.ToInt32(read[1]) == 1)   
        {   
            resigned = Convert.ToInt32(read[2]);   
            resign_count = read[3];   
        }   
        else   
        {   
            not_resigned = Convert.ToInt32(read[2]);   
            notresign_count = Convert.ToInt32(read[3]);    
        } 

Кроме того, учтите, что в каждой итерации или цикле while вы будете перезаписывать переменные resigned, resign_count или not_resigned и notresign_count.

1 голос
/ 26 января 2012

Будет ли это работать?

int resign = 0;
int not_resign = 0;
int resign_count = 0;
int not_resign_count = 0;

while (reader.Read())
{   
    if (Convert.ToInt32(reader["Resigned"]) == 1)
    {
        resign = Convert.ToInt32(reader["Sum"]);        
        resign_count = Convert.ToInt32(reader["Count"]);        
    }
    else
    {
        not_resign = Convert.ToInt32(reader["Sum"]);        
        not_resign_count = Convert.ToInt32(reader["Count"]);        
    } 
}
0 голосов
/ 26 января 2012

Можете ли вы опубликовать свой запрос из процедуры?Действительно ли имена столбцов "Сумма" и "Счет"?Есть зарезервированные слова, возможно, вам следует попробовать использовать «AS» и дать им другие имена для столбцов в проекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...