본문 바로가기

UNIX_LINUX_C_C++

[FreeTDS] FreeTDS를 이용한 UNIX에서 ODBC(MSSQL)이용하기

참고 : http://www.freetds.org/userguide/

7.0,8.0,4.2 의 차이는 속도면에서 매우 큰 차이를 보인다고 한다.

그런데 4.2가 제일 느리지만 문제가 제일 적은것 같다.

사용처에 따라 다르게 사용을 해야 할것으로 생각된다.

출처 : http://blog.empas.com/kim0mo/read.html?a=2515392&c=244539

<<<<<<<<<<<<<freetds.conf Setting>>>>>>>>>>>>>>>>

/usr/local/freetds/
에 설치 ?다면

vi /usr/local/freetds/etc/freetds.conf

freetds.conf를 수정한다.

[AploDBSrv]
host = [IP]// ODBC서버의 IP를 설정한다.
port = [PORT]// ODBC서버의 PORT를 설정한다.

추가 (서버이름 : AploDBSrv)

<<<<<<<<<<<<<<<Source>>>>>>>>>>>>>>>.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <signal.h>

#include <sybfront.h>
#include <sybdb.h>
#include <dblib.h>

int db_test();

static int syb_msg_handler(DBPROCESS *dbproc,DBINT msgno,int msgstate,int severity,char *msgtext,char *srvname,char *procname,int line)
{
// ------- msg 출력 routine를 작성한다 -----------
printf("syb_msg_handler [%s]\n", msgtext);
return 0;
}

static int syb_err_handler(DBPROCESS *dbproc,int severity,int dberr,int oserr,char *dberrstr,char *oserrstr)
{
//------- err msg 출력 routine를 작성한다 -----------
printf("syb_err_handler1 [%s]\n", dberrstr);
//return 0;
}

int main(int argc, char *argv[])
{
db_test();

printf("end...\n");
return 0;
}

int db_test()
{
printf("FreeTDS(유닉스에서 MS-SQL연결 테스트) ver 0.2. by k0mo\n\n");

LOGINREC *login; /* login information */
DBPROCESS *dbproc;
DBINT ageint;

// 혹시라도 SYBASE 환경변수를 인식을 못하는 경우가 있다면, 아래와 같이
// 써주세요. SYBASE환경변수 인식을 못하면 데이터를 못가져오거나
// 이상하게 가져오지요.
// .bashrc 나 .profile 등에 제대로 설정해놓았으면 문제는 없습니다만..

putenv("SYBASE=/usr/local/freetds");
putenv("TDSVER=42");

// 한글입력,갱신이 있을 경우는 버전을 4.2로 해주세요.
// 7.0은 한글처리가 안됩니다.
// putenv("TDSVER=70"); --> putenv("TDSVER=42");

dbinit(); /* db-lib를 초기화한다 */

// err-msg,msg handler를 등록. common.c 에 있는 함수.
// 에러메시지 안봐도 알게될 정도가 되면 아래 두 줄 막으시구요.
//dberrhandle( syb_err_handler );
dbmsghandle( syb_msg_handler );

login = dblogin(); // login record를 가져온다

DBSETLUSER(login,"degitalcline"); /* login id set */
DBSETLPWD(login,"degitalcline"); /* login pass word set */

// 아래 두줄은 안써도 상관 없음
DBSETLAPP(login,"APLO_SRV"); //SQL server쪽에 넘겨줄 어플리케이션명
DBSETLHOST(login,"CYBER-R"); //SQL server쪽에 넘겨줄 호스트명

dbsetlogintime(10);// connection timeout
dbproc = dbopen(login,"AploDBSrv");

dbsettime(10);// query timeout

printf("Connect ok!\n\n");
#if 0
// INSERT TEST
dbcmd(dbproc, "insert into Cust_Propos_T_TMP(Cust_Jumin_NO, Cust_Name) values('7205111011233','바보')");
dbsqlexec(dbproc);
#endif

// SELECT TEST
// RETCODE가 0이면 에러
RETCODE ret = dbcmd(dbproc, "select Cust_ProPos_NO,Cust_Jumin_NO,Cust_Name from Cust_Propos_T_TMP");
if(ret == 0) printf("error\n");
ret = dbsqlexec(dbproc);
if(ret == 0) printf("error\n");

dbresults(dbproc);

char no[10], jumin_no[14], name[21];
int cust_propos_no;

//dbbind(dbproc, 1, INTBIND, 0, (BYTE *)&cust_propos_no);
dbbind(dbproc, 1, STRINGBIND, 0, (BYTE *)no);
dbbind(dbproc, 2, STRINGBIND, 0, (BYTE *)jumin_no);
dbbind(dbproc, 3, STRINGBIND, 0, (BYTE *)name);

while(dbnextrow(dbproc) != NO_MORE_ROWS) {
printf("Result : cust_propos_no [%s] jumin_no[%s] name[%s]\n", no, jumin_no, name);
}

dbclose(dbproc);

dbexit();

return 0;
}