Background Image
조회 수 24541 추천 수 0 댓글 3
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
안녕하세요. 김대진 입니다.
홈페이지( http://www.qt-dev.com )

이전에 우리는 QT에 대해 알아보았습니다.  이번에는 CUBRID 데이터베이스에
접속하여 테이블을 검색하는 어플리케이션을 만들어 보도록 하겠습니다. 
 
 
 
앞의 그림은 CUBRID의 demodb 데이터베이스에 저장된 record테이블의 데이터를 검색하여 TableVive 위젯에 출력한
어플리케이션입니다.

데이터의 검색은 CCI API를 사용하였습니다. CCI API 는 CUBRID에서 제공하는 API로써 어플리케이션 프로그램을 직접 개발할 수
있도록 API를 제공합니다.
 
QT에서는 아직 공식적으로 CUBRID 라이브러리를 제공하지 않으므로 qmake로 생성된 Makefile 에 라이브러리 PATH 를 설정해야
합니다. Makefile의 수정은 추후 설명하기로 하고 소스부터 살펴보도록 하겠습니다.
 
mainwindow.h
 
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#define kor(str) QString::fromLocal8Bit(str)
class QAction;
class QTableView;
class QStandardItemModel;
class QAbstractItemModel;
class QItemSelectionModel;
class QModelIndex;
class QComboBox;
class QLineEdit;
class QPushButton;
class MainWindow : public QMainWindow
{
 Q_OBJECT
 
public:
 MainWindow();
  
private:
 QString host, user, passwd, database;
 QTextCodec *codec;
 
 QWidget  *main_page;
 
 QTableView *table_view;
 QAbstractItemModel  *tab_model;
 QItemSelectionModel *tab_selectionModel;
 
 void init();
 
 void create_amainWidget();
 void db_query();
};
#endif

 
 
mainwindow.cpp
#include <QtGui>
#include <QtSql>
#include <stdio.h>
#include <cas_cci.h>
#include "mainwindow.h"

MainWindow::MainWindow()
{
 init();
 setWindowTitle(codec->toUnicode("RECORD"));
 
 create_mainWidget();
 db_query();
}

void MainWindow::init()
{
 codec = QTextCodec::codecForName("eucKR");
 QFont font( "unifont", 10, QFont::Bold);
}

void MainWindow::create_mainWidget()
{
 tab_model = new QStandardItemModel(0, 6, this);
 table_view = new QTableView;
 table_view->setModel(tab_model);
 
 tab_model->setHeaderData(0, Qt::Horizontal,
   codec->toUnicode("host_year") );
 tab_model->setHeaderData(1, Qt::Horizontal,
   codec->toUnicode("event_code") );
 tab_model->setHeaderData(2, Qt::Horizontal,
   codec->toUnicode("athlete_code") );
 tab_model->setHeaderData(3, Qt::Horizontal,
   codec->toUnicode("medal") );
 tab_model->setHeaderData(4, Qt::Horizontal,
   codec->toUnicode("score") ); 
 tab_model->setHeaderData(5, Qt::Horizontal,
   codec->toUnicode("unit") ); 
 
 
 table_view->setColumnWidth(0,90);
 table_view->setColumnWidth(1,90);
 table_view->setColumnWidth(2,90);
 table_view->setColumnWidth(3,90);
 table_view->setColumnWidth(4,90);
 table_view->setColumnWidth(5,90);
   
 tab_selectionModel = new QItemSelectionModel(tab_model);
 table_view->setSelectionModel(tab_selectionModel);
 table_view->setSelectionBehavior(QAbstractItemView::SelectRows);
    
 main_page = new QWidget();
 QVBoxLayout *mainLayout = new QVBoxLayout(main_page);
 mainLayout->setSpacing(1);
        mainLayout->setMargin(1);
   
 mainLayout->addWidget(table_view);
 setCentralWidget(main_page);

}
void MainWindow::db_query()
{
int con = 0, req = 0, res, ind, i, col_count, lines=0;
    T_CCI_ERROR error;
    T_CCI_COL_INFO *res_col_info;
    T_CCI_SQLX_CMD cmd_type;
    char *buffer;

    // DB에 접속하기 위한 연결함수
    if ((con=cci_connect("localhost",30000,"demodb","PUBLIC",""))<0) {
        qDebug( "%s(%d): cci_connect fail "
            , __FILE__, __LINE__);
    }else{
     qDebug("CUBRID Connection OK. %s(%d)",__FILE__, __LINE__);
    }

// SQL문을 준비한다. 바인딩에 대한 정보와 컬럼에 대한 정보를 얻을 수 있다.
if ((req=cci_prepare(con, "select * from record", 0,&error))<0) {
                qDebug( "%s(%d): cci_prepare fail(%d)"
           , __FILE__, __LINE__, error.err_code);
                goto cubrid_error;
    }
 
printf("Prepare OK (%d) ",req);
   
// cci_prepare 함수에 의해 준비된 SELECT 문의 컬럼 정보에 대한 포인터를 얻어옴
res_col_info = cci_get_result_info(req, &cmd_type, &col_count);
    if (!res_col_info) {
        qDebug( "%s(%d): cci_get_result_info fail "
           , __FILE__, __LINE__);
        goto cubrid_error;
    }
 
 if ((res=cci_execute(req, 0, 0, &error))<0) {
        qDebug( "%s(%d): cci_execute fail(%d) "
           , __FILE__, __LINE__,error.err_code);
        goto cubrid_error;
    }

    // cci_fetch를 통해 서버에서 클라이언트로 전송되는 튜플의 개수를 정한다
    if ((res=cci_fetch_size(req, 100))<0) {
        qDebug( "%s(%d): cci_fetch_size fail ", __FILE__, __LINE__);
        goto cubrid_error;
    }
   
while (1) {
// 요청 핸들러에 설정되어 있는 커서를 이동시킨다.
       res = cci_cursor(req, 1, CCI_CURSOR_CURRENT, &error);
       if (res == CCI_ER_NO_MORE_DATA) {
         qDebug("Query END! ");
         break;
       }
       if (res<0) {
            qDebug( "%s(%d): cci_cursor fail(%d) "
            , __FILE__, __LINE__,error.err_code);
            goto cubrid_error;
       }
       // 클라이언트 버퍼로 결과를 받는다
       if ((res=cci_fetch(req, &error))<0) {
               qDebug( "%s(%d): cci_fetch fail(%d) "
                  , __FILE__, __LINE__,error.err_code);
               goto cubrid_error;
       }
  
tab_model->insertRows(lines, 1, QModelIndex());
        
      for (i=1; i<=col_count; i++) {
            // 현재 fetch된 결과에 대해서 변수 i번째의  결과를 가져온다.
            if ((res=cci_get_data(req, i, CCI_A_TYPE_STR
, &buffer, &ind))<0) {
                printf( "%s(%d): cci_get_data fail ", __FILE__, __LINE__);
                goto cubrid_error;
            }

            tab_model->setData(tab_model->index(lines, i-1
, QModelIndex()) , codec->toUnicode(buffer));
            }
       
            lines++;
       }

cubrid_error:;
 
}

 
main.cpp
 
#include <QApplication>
#include <QDesktopWidget>
#include <QSplashScreen>
#include <QStyleFactory>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
 QApplication app(argc, argv);
 
 QStringList styles = QStyleFactory::keys();
 app.setStyle( styles[3] );
 MainWindow mainWin;
 mainWin.resize(600,500);
 
 QDesktopWidget *desktop = QApplication::desktop();
 int w = desktop->width();
 int h = desktop->height();
 
 mainWin.move( (w-600)/2, (h-500)/2);
 
 mainWin.show();
 return app.exec();
}

위와 같이 소스를 작성한 다음 Makefile 을 다음과 같이 INCLUDE 와 LIBRARY PATH를 추가합니다.
 

CFLAGS   = -pipe -O2 -Wall -W -D_REENTRANT -I/usr/local/src/CUBRID/include $(DEFINES)
CXXFLAGS = -pipe -O2 -Wall -W -D_REENTRANT -I/usr/local/src/CUBRID/include $(DEFINES)
 
LIBS          = $(SUBLIBS)  -L/usr/local/qt/lib -lQtSql -L/usr/local/qt/lib -pthread -pthread -lQtGui -L/usr/X11R6/lib -pthread -lpng -lfreetype -lgobject-2.0 -lSM -lICE -pthread -pthread -lXrender -lfontconfig -lXext -lX11 -lQtCore -lz -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -ldl -lpthread -L/usr/local/src/CUBRID/lib -lcascci -lnsl

 
 

 
 
 
 
 
 
 
CFLAGS CXXFLAGS 변수에 헤더파일에 -I/usr/local/src/CUBRID/include”를 추가하고, LIBS 변수에
“-L/usr/local/src/CUBRID/lib -lcascci –lnsl” 옵션을 추합니다.
 
여기까지 CUBRID데이터베이스를 연동하여 Qt어플리케이션을 개발하는 방법에 대해 알아보았습니다.
CUBRID데이터베이스가 활성화 되길 바라며 여기서 이만 줄이도록하겠습니다.
 
허접해도 끝까지 읽어주셔서 갑니다. ^^;
  • ?
    cubebridge 2010.01.27 04:04
    QT에 관심이 있었는데 김대진님께서 좋은 자료 올려주셨네요^^
    감사합니다.~
  • ?
    seongjoon 2010.01.27 06:05
    학교에서 임베디드 프로그래밍을 배울 때, qt를 사용한 기억이 있습니다.
    이렇게 다시 접하게 되니 감회가 새롭네요^^
  • ?
    김대진 2010.01.27 18:43
    감사합니다.
    앞으로 시간나는데로 Qt 에서 어플리케이션 과 CUBRID를 연동한 다른 문서도 올리도록
    할께요. 허접하더라도 많은 양해 부탁드려요~ ㅡㅡ;
    (다시 읽어보니 오타가 장난아니에요ㅎㅎ)

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
106 기타 데이터베이스 생성하기 file 남재우 2011.03.07 29116
105 Linux 복제 따라하기 admin 2008.11.21 29096
104 Java QuantumDB Eclipse Plugin을 사용하여 CUBRID연동하기 2 cubebridge 2009.10.06 28922
103 튜닝 [질의튜닝]order by desc가 인덱스 타게 하려면 admin 2011.07.14 28486
102 Linux CUBRID DB와 Broker 분리방안 정만영 2010.04.28 28413
101 기타 스칼라 서브쿼리 사용 가이드 웁쓰 2009.12.31 28275
100 기타 조인 방법(Join Method) 설명 file 웁쓰 2009.12.31 27996
99 Windows CUBRID2008R2.0 Windows BACKUP 자동화 설정하기 정만영 2009.08.17 27942
98 Install CUBRID R2.0 ISV(Independent Software Vendor)설치방법 file cubebridge 2009.11.20 27922
97 Linux CUBRID Tutorial (Unix/Linux) 정만영 2009.08.17 27887
96 Java JavaSP SampleCode(Pivot기능) cubebridge 2009.07.28 27555
95 Windows 윈도우즈 환경에서 배치화일을 이용하여 백업 또는 데이터베이스 정리 수행하기 남재우 2010.03.03 27488
94 Java CUBRID JDBC에서 유니코드 사용하기 1 손승일 2009.08.15 27435
93 Install CUBRID2008 R2.1 업그레이드시 serial 관련 문제 해결 방법 남재우 2010.01.28 27348
92 Windows CUBRID2008 R2.0 Tutorial (Windows) cubebridge 2009.08.17 27340
91 Windows eclipse에서 python 및 CUBRID broker_log_top 사용하기 cubebridge 2009.07.28 27273
90 Linux CUBRID2008R1.x to 2.0 마이그레이션 가이드 (32bit 기준) 정만영 2009.08.17 27205
89 ODBC/OLEDB VB에서 CUBRID ODBC/OLEDB 사용하는 방법 및 샘플코드. file seongjoon 2012.06.30 26927
88 Linux 리소스를 제한(limits.conf) 하여 DB서버를 관리하자 1 주현 2015.12.31 26655
87 기타 csql(SQL 실행기) 사용법 1 admin 2008.11.21 26557
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales