Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Проблемы с wxDbTable и wxGrid


Автор: T0ohtik 31.7.2008, 11:57
Привет всем! Для работы с базой данных использую, wxDbTable. В конструкторе wxGrid записываются все поля из таблицы. Далее мене надо по нажатию на кнопку выполнять определенный запрос и отображать в грид, а вот это уже не получается.
Код

   wxDb*                    m_pDb;
   wxInt64*                m_nDataSourceId;              
   wxChar*                 m_strDataSourceConnectionString;
   wxInt32*                m_nDataSourceTypeId;          
   wxChar*                 m_strDataSourceName;            
   wxChar*                 m_strDataSourceOwnerId;
   wxDbTable*            m_DbTable;
   wxDbGridTableBase*   m_DbGridTableBase;
   wxGrid*                  m_grid;
...
   m_nDataSourceId                    = new wxInt64(2);
   m_strDataSourceConnectionString    = new wxChar[255];
     
   m_DbTable = new wxDbTable(m_pDb, wxT("data_source"), 5);
   m_DbTable->SetColDefs(0 , wxT("data_source_id"), DB_DATA_TYPE_INTEGER, m_nDataSourceId,  SQL_C_LONG, sizeof(wxInt64), true);
   m_DbTable->SetColDefs(1 , wxT("data_source_connection_string"), DB_DATA_TYPE_VARCHAR, m_strDataSourceConnectionString, SQL_C_WXCHAR, sizeof(wxChar) * 255 );
   
   m_DbTable->SetRowMode (wxDbTable::WX_ROW_MODE_QUERY);

      if(m_DbTable->Open() && m_DbTable->Query())
      {
         wxDbGridColInfo *columns;
         columns = new wxDbGridColInfo(0, wxGRID_VALUE_LONG, L"1", NULL);
         columns->AddColInfo (1, wxGRID_VALUE_STRING, L"2");       
         m_DbGridTableBase = new wxDbGridTableBase(m_DbTable, columns, wxUSE_QUERY, false);
                
         m_grid = new wxGrid (this, 10001);
         m_grid->SetTable(m_DbGridTableBase, false);
         m_grid->Fit();
      }

//Далее повторно делаем запрос

         m_DbTable->Refresh();
         m_DbTable->QueryBySqlStmt(L"Select * from data_source");

         assert(m_DbTable->Open() && m_DbTable->Query());

         m_DbGridTableBase->AssignDbTable(m_DbTable, false);
         assert(m_grid->SetTable(m_DbGridTableBase, false));
         m_grid->Fit();

    

Автор: Любитель 31.7.2008, 12:45
Что именно не получается? В чём проблема? Выражаётесь поточнее smile

Автор: T0ohtik 31.7.2008, 12:51
Как отрефрешить wxGrid после изменения запроса?

Автор: bilbobagginz 8.8.2008, 11:45
Код

         m_DbTable->Refresh();

запускается ДО запроса.

Автор: T0ohtik 8.8.2008, 12:04
bilbobagginz, немного не понял вопроса. Постараюсь еще раз описать суть проблемы. Есть БД MS SQL, есть wxGrid. wxGrid корректно отображает данные только при первом запросе.
Т.е. к примеру первы запрос у нас там Select * from id, а потом в программе надо сделать второй запрос Select * from id, так вот второй запрос выполнится нормально в  m_DbTable нужное количество нам строк (к примеру 12), а вот wxGrid выводит какую то фигню или 12 одинаковых строк или 12 строк с квадратиками.... 

Автор: bilbobagginz 8.8.2008, 12:17
я не помню точно как и при каких условиях, но wxWidgets направление сообщений между окнами не всегда интуитивно.
есть сообщения, идущие от отца к сыну, т.е. от m_grid к m_DbTable (т.е. вниз),
а есть которые идут от сына к отцу.
я думаю проблема именно с этим.
попробуйте в дебаггере посмотреть содержимое данных грида после запроса.
и еще, вы пробовали:
Код

m_grid->ForceRefresh();

после запроса ?



Автор: T0ohtik 8.8.2008, 12:29
Да что мы только не пробовали и Force и не Force, насколько я разобрался все происходит из - за того, что кто то в цепочке  wxGrid, wxDbGridTableBase, wxDbTable удаляет объявления колонок. Более менее начинает нормально работать, только при повторном создании колонок. Что не есть гуд. 

Автор: bilbobagginz 9.8.2008, 01:19
Цитата(T0ohtik @  8.8.2008,  12:29 Найти цитируемый пост)
Более менее начинает нормально работать, только при повторном создании колонок. Что не есть гуд.  

похоже на то, что вам стоит пообщатья с ребятами из wxwidgets, спросить их вопросы...
вообще-то про wxDbGridTableBase написано:
Цитата

If you need to requery an table object the preferred way is that the client keeps ownership.


Автор: t_rex 10.8.2008, 14:16
Ээ.. может немного не в тему топика, но от wxODBC потихоньку пора уходить, в 2.9 оно доступно только при включенной совместимости с 2.8, а в 3.0 будет упразднено. Поэтому лучше посмотреть в сторону DatabaseLayer. Подробнее на русском можно почитать здесь:
http://www.wxwidgets.info/wx_accessing_sqlite

Автор: T0ohtik 11.8.2008, 20:58
Цитата(t_rex @  10.8.2008,  14:16 Найти цитируемый пост)
Ээ.. может немного не в тему топика, но от wxODBC потихоньку пора уходить, в 2.9 оно доступно только при включенной совместимости с 2.8, а в 3.0 будет 

А где вы прочитали?smile Просто хочу тоже поглядеть, может что интересного еще нарою....

Автор: t_rex 13.8.2008, 13:20
Так а чего читать-то? Я пользуюсь сборкой из официального SVN-репозитория. Там wxODBC уже нету.
Ну а так:

http://trac.wxwidgets.org/timeline?from=2008-04-09T02%3A28%3A34Z-0700&precision=second

2008-03-29
12:10 Changeset [52910]  by FM

ODBC is not part of wx anymore

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)