Дурацкий CRecordset
MFC'сишный CRecordset не дает возможности хранить больше чем 255 записей, почему? или я чото напутал? (pavor, только не надо язвить по поводу своего класса)
А кто тут собира..
А нет сейчас о другом. Тогда зачем там есть переменная
long m_lRecordCount;
Если по твоим словам достаточно
BYTE m_btRecordCount;
А кто тут собира..
А нет сейчас о другом. Тогда зачем там есть переменная
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();
Как быть?
Хороше, как быть в такой ситуации:
Допустим у нас есть база данных в которой 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 пример на функцию
Хороше, как быть в такой ситуации:
Допустим у нас есть база данных в которой 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("Был не прав, извиняюсь!");
}
А попробуй вот так пересчитать:
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", вот так то!
АГА, а ты теперь попробуй вызвать (после того как выйдишь из цикла)
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++.
После выхода из цикла ты стоишь на зпаписи max+1, то есть на несуществующей - вот и ошибка ядра. Эта ерунда обрабатывается как исключительная ситуация (в MSDN почитаешь). Там нужно смещаться в начало записей для считывания (или на любую запись вообще). А вот count покажет сколько записей было обработано. И вообще ты можешь шагнуть на любую запись > 255, например на четырехсотую Move(400, SQL_FETCH_ABSOLUTE ). Вот так то
А GetFieldValue вообще достает данные из текущей строки и указанного столбца, а 255 у тебя наверное введено в таблице! Могу дать хороший совет вместо каскада недоговорок: firststeps.ru - там есть хорошее описание ODBC под Visual C++.
Хороше, спасибо, щас посмотрю, но завтра все равно оспорю тебя. :)