gpt4 book ai didi

C++ MFC 对话框 - 如何在列表控件中显示 MySQL 数据库中的项目?

转载 作者:行者123 更新时间:2023-11-29 00:09:57 25 4
gpt4 key购买 nike

我正在使用 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
}

这是用我的数据库中的数据填充列表控件后的图像:

Image of my list control after filling it with data from my database

如图所示,第一行显示正确,但接下来的六行重复数据逐行显示,然后下一个数据集在第八行正确显示。

最佳答案

您的代码存在的问题是,您在列表控件中为数据库行的每个列条目插入了一行。您只需在 for 循环之前将新行插入列表控件一次,例如,如下所示:

while(row = mysql_fetch_row(res))
{
// Insert a new row at the end of the list control.
// Do this only once per database row.
int nNewIndex = m_PplCounterCtrl.GetItemCount();
int nCurIndex = m_PplCounterCtrl.InsertItem(nNewIndex, row[0]);

// Insert all remaining database column entries.
// Insert them into the current row of the list control.
for(int i = 1; i < mysql_num_fields(res); i++)
{
m_PplCounterCtrl.SetItemText(nCurIndex, i, row[i]);
}
}

关于C++ MFC 对话框 - 如何在列表控件中显示 MySQL 数据库中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25640497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com