Я изучаю C++ MFC с помощью Visual studio 2005.C++ MFC Dialog - Как отображать элементы из базы данных MySQL в элементе управления списком?
Я хочу получить данные из базы данных Oracle MySQL и отобразить ее в элементе управления списком. Как-то код работает, но дисплей странный и ужасный, я чувствую, что чего-то не хватает из моего кода.
Как мне изменить код? В базе данных есть одно поле, которое я не хочу отображать, это UserID.
Ниже код, который я придумал:
void CPplCMain::OnBnClickedButton1()
{
unsigned short Port = 3306;
char *IPAddress = "127.0.0.1";
char *UserName = "root";
char *Password = "Root";
char *DBName = "inomatic";
MYSQL *ssock;
MYSQL_RES *res;
MYSQL_ROW row;
//char execsql[500];
ssock = (MYSQL *)malloc(sizeof(MYSQL));
//在某些版本中,不需要该初始化工作,可观看mysql.H以及readme
mysql_init(ssock);
if(ssock == NULL)
{
MessageBox("EROR: MySQL ssock init error. \n");
return;
}
//MessageBox("MySQL ssock init OK. \n");
ssock = mysql_real_connect(ssock, IPAddress, UserName, Password, NULL, Port, NULL, 0);
if(!ssock)
{
MessageBox("conn fail... \n");
mysql_errno(ssock);
}
if(mysql_select_db(ssock, DBName) != 0)
{
MessageBox("select db error. \n");
return;
}
//SQL查询语句
if(mysql_query(ssock,"SELECT countryName FROM countries"))
{
MessageBox("Found", mysql_error(ssock));
}
if(!(res = mysql_store_result(ssock)))
{
MessageBox("Disconnected!", mysql_error(ssock));
}
while((row = mysql_fetch_row(res)))
{
for(int i=0 ; i<mysql_num_fields(res); i++)
{
TRACE("%s ",row[i],"\n");
m_CountryList.AddString(row[i]);
}
TRACE("\n");
}
if(mysql_query(ssock,"SELECT * FROM shop"))
{
MessageBox("Shop table Found", mysql_error(ssock));
}
if(!(res = mysql_store_result(ssock)))
{
MessageBox("Disconnected!", mysql_error(ssock));
}
while((row = mysql_fetch_row(res)))
{
for(int i=0 ; i<mysql_num_fields(res); i++)
{
TRACE("%s ",row[i],"\n");
//m_ShopList.AddString(row[i]);
int nIndex = m_ShopListCtrl.InsertItem(i, row[i]);
m_ShopListCtrl.SetItemText(nIndex, i, row[i]);
}
TRACE("\n");
}
if(mysql_query(ssock,"SELECT * FROM peoplecounter"))
{
MessageBox("People Counter table Found", mysql_error(ssock));
}
if(!(res = mysql_store_result(ssock)))
{
MessageBox("Disconnected!", mysql_error(ssock));
}
while((row = mysql_fetch_row(res)))
{
for(int i=0 ; i<mysql_num_fields(res); i++)
{
TRACE("%s ",row[i], "\n");
//m_PplCounterList.AddString(row[i]);
int nIndex = m_PplCounterCtrl.InsertItem(i, row[i]);
m_PplCounterCtrl.SetItemText(nIndex, i, row[i]);
}
TRACE("\n");
}
mysql_close(ssock);
// TODO: Add your control notification handler code here
}
Вот изображение моего списка контроля после заполнения его данными из моей базы данных:
Как вы можете увидеть на изображении первая строка отображается правильно, но для следующих шести строк повторяющиеся данные отображаются по строкам, до того, как следующий набор данных будет правильно отображаться в строке восьмой.
_ «дисплей странно и ужасно»: _ Вы должны показать нам то, что вам на самом деле получить и то, что вы хотите получить. В противном случае никто не сможет вам помочь ... – honk
Я могу загрузить изображение из-за отсутствия повторений. Например, я получил 3 столбца элемента для отображения testid1, testname, testaddress. для 1-го ряда позиции отображается в правильном порядке в рулоне 1 testid1, testname1, testaddress1. Однако, когда он переходит во 2-ю строку, он должен отображать другие данные, такие как testid2, testname2, testaddress2. но вместо этого отображает testname1, а 2 других столбца пусты и строка 3 testaddress1. , когда он заканчивается, 4-й рядный дисплей testid2, testname2, testaddress2. и продолжить ту же картину. – 2014-09-09 01:51:29
Я мало знаю о MySQL, но, согласно документации по [mysql_fetch_row()] (http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html), вы можете необходимо использовать функцию [mysql_fetch_lengths()] (http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-lengths.html). – honk