2014-09-03 2 views
1

Я изучаю 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 
} 

Вот изображение моего списка контроля после заполнения его данными из моей базы данных:

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

Как вы можете увидеть на изображении первая строка отображается правильно, но для следующих шести строк повторяющиеся данные отображаются по строкам, до того, как следующий набор данных будет правильно отображаться в строке восьмой.

+0

_ «дисплей странно и ужасно»: _ Вы должны показать нам то, что вам на самом деле получить и то, что вы хотите получить. В противном случае никто не сможет вам помочь ... – honk

+0

Я могу загрузить изображение из-за отсутствия повторений. Например, я получил 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

+0

Я мало знаю о 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

ответ

1

Проблема с вашим кодом заключается в том, что вы вставляете строку в свой элемент управления списком для каждой записи столбца строки базы данных. Вы должны вставить новую строку в список вашего контроля только один раз перед вашим 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]); 
    } 
} 
+0

Thank вы! наконец, его решить! Я выясняю, где я ошибаюсь и меняю похожий код, но индексный индекс вместо 0,1,2,3,4 меняет 4,3,2,1,0. ваш код совершенен, решите все мои ошибки, я изменил свой код, чтобы использовать ваши! еще раз большое вам спасибо! ^^ learning C++ MFC Dialog сложно x.X может понадобиться ваша помощь часто: D – 2014-09-11 03:24:35

+0

Добро пожаловать! И изучение MFC - действительно вызов. Если у вас возникнут дополнительные проблемы, просто отправьте еще один вопрос о SO. Но, пожалуйста, убедитесь, что он [правильно отформатирован] (http://stackoverflow.com/editing-help), и вы даете как можно больше деталей с самого начала. Первоначально [хороший вопрос] (http://stackoverflow.com/help/how-to-ask) имеет наибольшую вероятность получить ответ. Но вы можете изменить свой вопрос в любое время, чтобы улучшить его. – honk

Смежные вопросы