조회 수 25944 추천 수 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
번호 분류 제목 글쓴이 날짜 조회 수
87 PHP apache, php rpm package 생성 시 필요한 rpm 스펙 file admin 2011.07.14 26873
86 Linux CUBRID Linux 부팅시 자동시작 서비스 설정 방법 정만영 2013.09.16 27059
85 Windows windows 환경에서 여러버젼의 CUBRID 설치하여 사용하기 4 남재우 2009.09.16 27410
84 Install CUBRID6.6 이상에서 CUBRID2008 로 데이터베이스 이전 하기 3 남재우 2008.11.21 27843
83 ODBC/OLEDB VB에서 CUBRID ODBC/OLEDB 사용하는 방법 및 샘플코드. file seongjoon 2012.06.30 28231
82 기타 HA 환경 구성 시 데이터 복제 지연이 발생하는 경우 ECHO(7) port를 확인하자. 손승일 2012.11.29 28244
81 기타 Oracle의 SYS_CONNECT_BY_PATH 함수 흉내내기 CUBRID_DEV 2009.06.15 28262
80 기타 csql(SQL 실행기) 사용법 1 admin 2008.11.21 28263
79 Linux CUBRID2008R1.x to 2.0 마이그레이션 가이드 (32bit 기준) 정만영 2009.08.17 28359
78 Windows eclipse에서 python 및 CUBRID broker_log_top 사용하기 cubebridge 2009.07.28 28474
77 Windows CUBRID2008 R2.0 Tutorial (Windows) cubebridge 2009.08.17 28482
76 Install CUBRID2008 R2.1 업그레이드시 serial 관련 문제 해결 방법 남재우 2010.01.28 28664
75 Java CUBRID JDBC에서 유니코드 사용하기 1 손승일 2009.08.15 28920
74 Java JavaSP SampleCode(Pivot기능) cubebridge 2009.07.28 29118
73 Linux CUBRID Tutorial (Unix/Linux) 정만영 2009.08.17 29138
72 Install CUBRID R2.0 ISV(Independent Software Vendor)설치방법 file cubebridge 2009.11.20 29154
71 Windows 윈도우즈 환경에서 배치화일을 이용하여 백업 또는 데이터베이스 정리 수행하기 남재우 2010.03.03 29311
70 Linux 리소스를 제한(limits.conf) 하여 DB서버를 관리하자 1 주현 2015.12.31 29396
69 기타 동시 접속자에 따른 파라미터 설정 admin 2011.07.14 29485
68 Linux CUBRID DB와 Broker 분리방안 정만영 2010.04.28 29586
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

Contact Cubrid

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

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

나눔고딕 사이트로 가기

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5