Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Дурацкий CRecordset

1.2K
06 апреля 2004 года
Kalitkin
108 / / 05.03.2004
MFC'сишный CRecordset не дает возможности хранить больше чем 255 записей, почему? или я чото напутал? (pavor, только не надо язвить по поводу своего класса)
527
06 апреля 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by Kalitkin
MFC'сишный CRecordset не дает возможности хранить больше чем 255 записей, почему? или я чото напутал? (pavor, только не надо язвить по поводу своего класса)



А кто тут собира..
А нет сейчас о другом. Тогда зачем там есть переменная
long m_lRecordCount;
Если по твоим словам достаточно
BYTE m_btRecordCount;

1.2K
08 апреля 2004 года
Kalitkin
108 / / 05.03.2004
Цитата:
Originally posted by pavor


А кто тут собира..
А нет сейчас о другом. Тогда зачем там есть переменная
long m_lRecordCount;
Если по твоим словам достаточно
BYTE m_btRecordCount;



Хороше, как быть в такой ситуации:

Допустим у нас есть база данных в которой 2 поля - id и name, всего записей 400, далее пишем:

CString sql;
sql.Format("SELECT * FROM mytable");
m_Recordset->Open(CRecordset::snapshot, sql);
m_Recordset->MoveLast();
m_Recordset->GetFieldValue("name", sql);
MessageBox(sql); // так вот sql=255 а не 400
m_Recordset->Close();

Как быть?

527
08 апреля 2004 года
pavor
275 / / 28.09.2003
Цитата:
Originally posted by Kalitkin


Хороше, как быть в такой ситуации:

Допустим у нас есть база данных в которой 2 поля - id и name, всего записей 400, далее пишем:

CString sql;
sql.Format("SELECT * FROM mytable");
m_Recordset->Open(CRecordset::snapshot, sql);
m_Recordset->MoveLast();
m_Recordset->GetFieldValue("name", sql);
MessageBox(sql); // так вот sql=255 а не 400
m_Recordset->Close();

Как быть?



Вообще то GetFieldValue получает значение поля в БД у текущей записи. Посмотри в MSDN пример на функцию

462
08 апреля 2004 года
little brother
81 / / 18.10.2002
Цитата:
Originally posted by Kalitkin


Хороше, как быть в такой ситуации:

Допустим у нас есть база данных в которой 2 поля - id и name, всего записей 400, далее пишем:

CString sql;
sql.Format("SELECT * FROM mytable");
m_Recordset->Open(CRecordset::snapshot, sql);
m_Recordset->MoveLast();
m_Recordset->GetFieldValue("name", sql);
MessageBox(sql); // так вот sql=255 а не 400
m_Recordset->Close();

Как быть?



А попробуй вот так пересчитать:
CString str;
str = "SELECT * FROM mytable";
m_Recordset->Open(CRecordset::snapshot, str);
int count = 0;
while (!m_Recordset.IsEOF())
{
count++;
m_Recordset.MoveNext();
}
m_Recordset.Close();

if(count > 255)
{
AfxMessageBox("Был не прав, извиняюсь!");
}

1.2K
08 апреля 2004 года
Kalitkin
108 / / 05.03.2004
Цитата:
Originally posted by little brother


А попробуй вот так пересчитать:
CString str;
str = "SELECT * FROM mytable";
m_Recordset->Open(CRecordset::snapshot, str);
int count = 0;
while (!m_Recordset.IsEOF())
{
count++;
m_Recordset.MoveNext();
}
m_Recordset.Close();

if(count > 255)
{
AfxMessageBox("Был не прав, извиняюсь!");
}



АГА, а ты теперь попробуй вызвать (после того как выйдишь из цикла)

m_Recordset->GetFieldValue("name", str);

и приколишся с ошибки ядра!

более того, когда ты после этого цикла сделаешь

m_Recordset->MoveLast();
а потом
m_Recordset->GetFieldValue("name", str);

то str="255", вот так то!

462
08 апреля 2004 года
little brother
81 / / 18.10.2002
Цитата:
Originally posted by Kalitkin


АГА, а ты теперь попробуй вызвать (после того как выйдишь из цикла)

m_Recordset->GetFieldValue("name", str);

и приколишся с ошибки ядра!

более того, когда ты после этого цикла сделаешь

m_Recordset->MoveLast();
а потом
m_Recordset->GetFieldValue("name", str);

то str="255", вот так то!



После выхода из цикла ты стоишь на зпаписи max+1, то есть на несуществующей - вот и ошибка ядра. Эта ерунда обрабатывается как исключительная ситуация (в MSDN почитаешь). Там нужно смещаться в начало записей для считывания (или на любую запись вообще). А вот count покажет сколько записей было обработано. И вообще ты можешь шагнуть на любую запись > 255, например на четырехсотую Move(400, SQL_FETCH_ABSOLUTE ). Вот так то
А GetFieldValue вообще достает данные из текущей строки и указанного столбца, а 255 у тебя наверное введено в таблице! Могу дать хороший совет вместо каскада недоговорок: firststeps.ru - там есть хорошее описание ODBC под Visual C++.

1.2K
09 апреля 2004 года
Kalitkin
108 / / 05.03.2004
Цитата:
Originally posted by little brother


После выхода из цикла ты стоишь на зпаписи max+1, то есть на несуществующей - вот и ошибка ядра. Эта ерунда обрабатывается как исключительная ситуация (в MSDN почитаешь). Там нужно смещаться в начало записей для считывания (или на любую запись вообще). А вот count покажет сколько записей было обработано. И вообще ты можешь шагнуть на любую запись > 255, например на четырехсотую Move(400, SQL_FETCH_ABSOLUTE ). Вот так то
А GetFieldValue вообще достает данные из текущей строки и указанного столбца, а 255 у тебя наверное введено в таблице! Могу дать хороший совет вместо каскада недоговорок: firststeps.ru - там есть хорошее описание ODBC под Visual C++.



Хороше, спасибо, щас посмотрю, но завтра все равно оспорю тебя. :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог