我正在使用 Visual Studio 2005 学习 C++ MFC。
我想从 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
}
这是用我的数据库中的数据填充列表控件后的图像:
正如您在图像中看到的,第一行显示正确,但接下来的六行重复数据逐行显示,然后下一个数据集在第八行中正确显示。