У меня есть база данных MS Access, содержащая таблицу ANIMATEUR и имеющая 3 столбца:
Я могу читать данные столбцов varchar, но моя проблема в том, что когда я пытаюсь прочитать целочисленный столбец - я получаю сообщение об ошибке... Я думаю, что проблема вызвана литьем из целого в CString.
Вот мой код:
void gestionAnimateur::refreshList(){
m_liste.DeleteAllItems();
COleVariant var;
CString nom,prenom,id;
database.Open(cheminDB);
record.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM ANIMATEUR",NULL);
int i = 0;
while(! record.IsEOF()){
record.GetFieldValue("id",var);
id= (LPCSTR) var.pbstrVal;
m_liste.InsertItem(i,id,0);
record.GetFieldValue("prenom",var);
prenom = (LPCSTR) var.pbstrVal;
m_liste.SetItemText(i,1,prenom);
record.GetFieldValue("nom",var);
nom = (LPCSTR) var.pbstrVal;
m_liste.SetItemText(i,2,nom);
i++;
record.MoveNext();
}
database.Close();
record.Close();
}
решение здесь - это код ETDITED:
void gestionAnimateur::refreshList(){
m_liste.DeleteAllItems();
COleVariant var;
CString nom,prenom,idStr;
int idInt;
char idChar[12];
database.Open(cheminDB);
record.Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM ANIMATEUR",NULL);
int i = 0;
while(! record.IsEOF()){
record.GetFieldValue("id",var);
idInt = var.intVal;
itoa(idInt,idChar,10);
idStr=idChar;
m_liste.InsertItem(i,idStr,0);
record.GetFieldValue("prenom",var);
prenom = (LPCSTR) var.pbstrVal;
m_liste.SetItemText(i,1,prenom);
record.GetFieldValue("nom",var);
nom = (LPCSTR) var.pbstrVal;
m_liste.SetItemText(i,2,nom);
i++;
record.MoveNext();
}
database.Close();
record.Close();
}
Это потому, что вы пытаетесь сохранить int в CString. Сначала получите правильный тип с var.vt, а затем получите правильное значение соответственно (если это действительно int, то vt.intVal). Когда у вас есть int, вы можете преобразовать его в строку (std :: to_string, если у вас есть C++ 11 или std :: atoi).
Кстати, C cast уродливые и небезопасные, предпочитают C++ отливки.