c # - заполнить общий список из SqlDataReader - PullRequest
11 голосов
/ 10 апреля 2011

Как я могу добавить значения, которые SqlDataReader возвращает в общий список?У меня есть метод, где я использую SqlDataReader, чтобы получить CategoryID из таблицы Category.Я хотел бы добавить все CategoryID общий список.

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

Как мне это сделать?

SqlConnection connection = null;
SqlDataReader reader = null;
SqlCommand cmd = null;

try
{
    connection = new SqlConnection(connectionString);
    cmd = new SqlCommand("select CategoryID from Categories", connection );

    connection.Open();

    List<int> catID = new List<int>();
    dr = cmd.ExecuteReader();
    while (dr.Read())
    {
        catID.Add(Convert.ToInt32(dr["CategoryID"].ToString()));
    }
}
finally
{
    if (connection  != null)
        connection.Close();
}
return catID;

Ответы [ 5 ]

15 голосов
/ 10 апреля 2011

Попробуй вот так, лучше, безопаснее, ленивая загрузка, меньше кода, работа, ...:

public IEnumerable<int> GetIds()
{
    using (var connection = new SqlConnection(connectionString))
    using (var cmd = connection.CreateCommand())
    {
        connection.Open();
        cmd.CommandText = "select CategoryID from Categories";
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                yield return reader.GetInt32(reader.GetOrdinal("CategoryID"));
            }
        }
    }
}

, а затем:

List<int> catIds = GetIds().ToList();
3 голосов
/ 10 апреля 2011

Ваш текущий код должен работать, предполагая, что catID действительно объявлено перед блоком try, иначе это не скомпилируется.

1 голос
/ 10 апреля 2011

AS BrokenGlass объяснил, что это демонстрация

SqlConnection connection = null;
        SqlDataReader dr= null;
        SqlCommand cmd = null;
List<int> catID = new List<int>();
        try
        {
            connection = new SqlConnection(connectionString);
            cmd = new SqlCommand("select CategoryID from Categories", connection );

            connection.Open();



            dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                catID.Add(Convert.ToInt32(dr["CategoryID"].ToString()));
            }


        }
        finally
        {
            if (connection  != null)
                connection.Close();
        }
        return catID;

а также вы меняете декларацию

SqlDataReader reader = null;

до

SqlDataReader dr= null; // Because you are using dr in the code not reader
0 голосов
/ 14 августа 2013
        List<int> s = new List<int>();
        conn.Open();
        SqlCommand command2 = conn.CreateCommand();
        command2.CommandText = ("select turn from Vehicle where Pagged='YES'");
        command2.CommandType = CommandType.Text;
        SqlDataReader reader4 = command2.ExecuteReader();
        while (reader4.Read())
        {
            s.Add(Convert.ToInt32((reader4["turn"]).ToString()));
        }
        conn.Close();
0 голосов
/ 10 апреля 2011

Это должно работать, но я предлагаю вам использовать using с вашим connections

    SqlConnection connection = null;
    SqlDataReader reader = null;
    SqlCommand cmd = null;
    List<int> catID = new List<int>();
    try
    {
        connection = new SqlConnection(connectionString);
        cmd = new SqlCommand("select CategoryID from Categories", connection );

        connection.Open();



        dr = cmd.ExecuteReader();
        while (dr.Read())
        {   
            catID.Add(Convert.ToInt32(dr["CategoryID"].ToString()));
        }


    }
    finally
    {
        if (connection  != null)
            connection.Close();
    }
    return catID;
...