powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / FBDataReader показывает, что в наборе записей есть строки, но не проходит по ним
7 сообщений из 7, страница 1 из 1
FBDataReader показывает, что в наборе записей есть строки, но не проходит по ним
    #38127660
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
        private void btnDoIt_Click(object sender, EventArgs e){
            FBDB db = new FBDB();
            string sql = "SELECT * FROM PLANETS";
            if (db.OpenRecordset(sql)) {
                FbDataReader rs = db.GetRecordset();
                int colWidth = listView1.Width/rs.FieldCount;
                for (int i = 0; i < rs.FieldCount; i++) {
                    string fName = rs.GetName(i);
                    listView1.Columns.Add(fName, colWidth);
                }
                Console.WriteLine("В рекордсете есть строки: " + rs.HasRows.ToString()); //тут пишет, мол, TRUE
                while (rs.Read()) { // а вот после этой строки сразу выходит из цикла
                    ListViewItem lvi = this.listView1.Items.Add(rs.GetString(0));
                    for (int i = 1; i < rs.FieldCount; i++) { 
                        lvi.SubItems.Add(rs.GetString(i));
                    }
                }
                db.CloseRecordset();
            }
        }


Где напортачил, помогите разобраться, плз...
Ваяю: MS Access 2003, mdb | VB.NET + mdb/SQL Express | 1С 8.2.14, тонкий клиент, управляемое приложение
...
Рейтинг: 0 / 0
FBDataReader показывает, что в наборе записей есть строки, но не проходит по ним
    #38127681
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КириллН,

Разобрался. Рекордсет был уже "пройденным" на этапе открытия, недоглядел:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        public Boolean OpenRecordset(string sql) {
            if (this.fbDB.State == ConnectionState.Closed)
                this.fbDB.Open();
            FbTransaction fbt = this.fbDB.BeginTransaction();
            this.sqlCommand = new FbCommand(sql, this.fbDB);
            this.sqlCommand.Transaction = fbt;
            this.recordSet = this.sqlCommand.ExecuteReader();
            while (this.recordSet.Read()) { }
            return true;
        }
...
Рейтинг: 0 / 0
FBDataReader показывает, что в наборе записей есть строки, но не проходит по ним
    #38127682
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КириллН,

Отсюда, кстати, вопрос: как вернуться к началу набора, если это вообще возможно? И как получить количество записей в наборе?
...
Рейтинг: 0 / 0
FBDataReader показывает, что в наборе записей есть строки, но не проходит по ним
    #38127699
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в чем тайный смысл этого: while (this.recordSet.Read()) { } ????

DbDataReader - это быстрое чтение вперед. Вот прямо строка из MSDN:
Предоставляет возможность чтения потока строк только в прямом направлении из базы данных

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

Количество записей в наборе можно получить постфактум по длине загруженного списка или, к примеру, черех выходной параметр процедуры на SQL сервере. Вариантов несколько
...
Рейтинг: 0 / 0
FBDataReader показывает, что в наборе записей есть строки, но не проходит по ним
    #38127709
КириллН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arm79а в чем тайный смысл этого: while (this.recordSet.Read()) { } ????

DbDataReader - это быстрое чтение вперед. Вот прямо строка из MSDN:
Предоставляет возможность чтения потока строк только в прямом направлении из базы данных

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

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

Вас понял. Тайного смысла в while (this.recordSet.Read()) { } нет, оставил строку, чтобы не забыть, как по набору записей двигаться. =) И забыл удалить. Теперь исправил удалением этой строки - все норм.

Загрузить набор записей в список - это как (листинг)? И есть ли в этом смысл если FbDataRreader работает быстро (быстрее прочих вариантов?), как Вы сказали?
...
Рейтинг: 0 / 0
FBDataReader показывает, что в наборе записей есть строки, но не проходит по ним
    #38127776
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КириллНИ есть ли в этом смысл если FbDataRreader работает быстро (быстрее прочих вариантов?), как Вы сказали?

Вы внимательнее читайте, что я пишу. Иные варианты я не упоминал. Хотя действительно, это самый быстрый вариант. Но для вас других вариантов просто-напросто нет. Ели вы отображаете в гриде полученные записи, то предварительно эти записи все равно загружаются в список. А грузить на клиента записи, чтобы агрегировать какие-либо значения - просто бессмысленно. Это работа СУБД.

листинг - это примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
        public IList<Table_1> GetList(int id)
        {
            List<Table_1> result = new List<Table_1>();

            using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["tst"].ConnectionString))
            {
                con.Open();

                using (var com = new SqlCommand("select id, name, comment from Table_1 where id > @id", con) {CommandType = CommandType.Text})
                {
                    com.Parameters.AddWithValue("@id", id);

                    var rd = com.ExecuteReader(CommandBehavior.CloseConnection);
                    while (rd.Read())
                    {
                        result.Add(
                            new Table_1()
                                {
                                    Id = DBNull.Value != rd["id"] ? (int) rd["id"] : -1,
                                    Name = DBNull.Value != rd["name"] ? (string)rd["name"] : "NULL",
                                    Comment = DBNull.Value != rd["comment"] ? (string)rd["comment"] : "NULL",
                                }
                            );
                    }
                }
            }

            return result;
        }
...
Рейтинг: 0 / 0
FBDataReader показывает, что в наборе записей есть строки, но не проходит по ним
    #38127781
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ забыл com.ExecuteReader(CommandBehavior.CloseConnection); также в using упаковать.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / FBDataReader показывает, что в наборе записей есть строки, но не проходит по ним
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]