database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
ㆍInformix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Informix Q&A 3450 게시물 읽기
No. 3450
informix odbc 연결 관련..
작성자
초보DBA(r00tlee)
작성일
2016-10-17 13:50ⓒ
2016-10-17 17:56ⓜ
조회수
5,313

 안녕하세요. informix odbc 관련하여 도움이 필요하여 글을 적게 되었습니다..

 
  char *connect_string = "Driver={/opt/informix/lib/cli/libifcli.so};dsn=testdb;UID=informix;PWD=qhdks./;";
 
SQLDriverConnect 함수 사용할때 connect_string 셋팅을 저렇게 잡아주었거든요..
 
그리고 컴파일 할때 cc -o odbc_test odbc_test.c -L/opt/informix/lib/cli -lifcli 이렇게 명령어를 날리니..
 
odbc_test 바이너리 파일이 만들어졌고요.. 이걸 실행했더니..
 
 
 
IM002:1:4294956255:[Informix][Informix ODBC Driver]Data source name not found and no default driver specified. 이런 메세지가 발생하네요..
 
제 추측으로는 connect_string쪽에서 뭔가 셋팅이 잘못되어서 그런 것 같은데 어디 부분이 잘못된건지 모르겠네요.. 도움 부탁드리겠습니다. ㅠ_ㅠ
 
추가적으로 SQLDriverConnect 함수를 사용하면 $INFORMIXDIR/etc/odbc.ini 파일 셋팅 필요없지 않나요..?
 
 
 
 

 

이 글에 대한 댓글이 총 11건 있습니다.

우선 odbc.ini, odbcinst.ini 파일 설정이 우선되어야 할 것 같습니다.

아래 글에서 드라이버나 DSN은 해당 파일을 참조한다고 합니다.

 

Configure a DSN on UNIX

http://www.ibm.com/support/knowledgecenter/en/SSGU8G_12.1.0/com.ibm.odbc.doc/ids_odbc_057.htm

 

그리고 샘플소스를 보면 아래와 같이 드라이버를 직접 명시하지는 않습니다. ($INFORMIXDIR/demo/cli/dbcreate.c)

SQLCHAR         connStrIn[BUFFER_LEN];

...
/* Establish the database connection */
sprintf((char *) connStrIn, "DSN=%s;connectdatabase=NO", dsn);
 
참고하시기 바랍니다.
정상규(pajama)님이 2016-10-17 23:46에 작성한 댓글입니다.

odbc.ini 파일에 있는 Servername은 무엇을 말하는건가요?

초보DBA(r00tlee)님이 2016-10-18 10:40에 작성한 댓글입니다.

 servername은 인포믹스의 인스턴스 명을 뜻합니다.

인포믹스 서버의 INFORMIXSERVER 환경변수를 확인해보시거나

$INFORMIXDIR/etc/sqlhosts 파일의 첫번째 필드가 인포믹스 인스턴스 명을 의미합니다.

정상규(pajama)님이 2016-10-18 12:23에 작성한 댓글입니다.

답변 감사합니다.

vi /etc/service 쪽 파일을 열어보니 sqlexec 쪽 포트번호가 9088로 되어있어서..

vi /opt/informix/etc/sqlhost 파일에 4번째 필드 포트번호 9088로 변경 후

db내렸다가 다시 올리고 다시 해보니...

28000:1:4294966345:[Informix][Informix ODBC Driver][Informix]Incorrect password or user informix@centos128 is not known on the database server.

 

이런 메세지가 발생을 하네요..

odbc.ini 파일에 셋팅 값은

[ODBC Data Sources]
Infdrv1=IBM INFORMIX ODBC DRIVER
Infdrv2=IBM INFORMIX ODBC DRIVER
;
; Define ODBC Database Driver's Below - Driver Configuration Section
;
[Infdrv1]
Driver=/opt/informix/lib/cli/iclit09b.so
Description=IBM INFORMIX ODBC DRIVER
Database=testdb
LogonID=informix
pwd=qhdks./
Servername=centos128
 
이렇게 셋팅 되어 있습니다.
 
dbaccess testdb -
select 1 from dual;
날려보면 잘 되거든요..
 
su - informix 비번 qhdks./로 접속을 해봐도 잘 되고요..
 
netstat -a | grep sqlexec 해봐도
tcp        0      0 centos128:sqlexec           *:*                         LISTEN
 
잘 되는 것 같은데..
 
뭐가 문제인지 잘 모르겠네요.. ㅠ_ㅠ
초보DBA(r00tlee)님이 2016-10-18 14:55에 작성한 댓글입니다.
이 댓글은 2016-10-18 14:58에 마지막으로 수정되었습니다.

내용을 보면 인스턴스명도 centos128이고 호스트명도 centos128인 것 같습니다.

sqlhosts 파일에서 centos128이 접속하시려는 대상 인스턴스 명이 맞나요?
메시지 내용만 봐서는 ID/패스워드가 잘못된 것입니다.

제가 unixodbc의 isql로 테스트한 내용입니다.

export INFORMIXDIR=/work/skjeong/ids1210fc6/
export INFORMIXSQLHOSTS=/root/skjeong/sqlhosts
export ODBCINI=/work/skjeong/ids1210fc6/etc/odbc.ini
export LD_LIBRARY_PATH=/work/skjeong/ids1210fc6/lib/:/work/skjeong/ids1210fc6/lib/esql/:$LD_LIBRARY_PATH
# cat /root/skjeong/sqlhosts
ids1150fc9      onsoctcp        11.22.33.44   9088
# cat /work/skjeong/ids1210fc6/etc/odbc.ini
[ODBC Data Sources]
Infdrv1=IBM INFORMIX ODBC DRIVER
Infdrv2=IBM INFORMIX ODBC DRIVER
;
; Define ODBC Database Driver's Below - Driver Configuration Section
;
[Infdrv1]
Driver=/work/skjeong/ids1210fc6/lib/cli/iclit09b.so
Description=IBM INFORMIX ODBC DRIVER
Database=stores_demo
LogonID=informix
pwd=informix
Servername=ids1150fc9
CLIENT_LOCALE=en_us.8859-1
DB_LOCALE=en_us.8859-1
...
Trace=0
TraceFile=/tmp/odbctrace.out
InstallDir=/work/skjeong/ids1210fc6
TRACEDLL=idmrs09a.so



# isql -v Infdrv1
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select tabname from systables where tabid =1;
+---------------------------------------+
| tabname                               |
+---------------------------------------+
| systables                             |
+---------------------------------------+
SQLRowCount returns -1
1 rows fetched
 
정상규(pajama)님이 2016-10-18 18:32에 작성한 댓글입니다.

 혹시.. 비루트로 설치하면 그럴 수도 있는건가요..?

초보DBA(r00tlee)님이 2016-10-19 09:44에 작성한 댓글입니다.

인포믹스는 non-root 설치인 경우 OS인증이 되지 않습니다.

아래 매뉴얼에 나와있는 내용입니다.

http://www.ibm.com/support/knowledgecenter/en/SSGU8G_11.70.0/com.ibm.sec.doc/ids_am_046.htm#ids_am_046.dita

The non-root server cannot authenticate users based on system calls to the OS level.
 
참고하세요.
정상규(pajama)님이 2016-10-19 09:50에 작성한 댓글입니다.

 답변 정말 감사합니다. ㅠ_ㅠ 정말 삽질 많이 했었는데..

결국 루트로 설치를 했어야 했네요..

초보DBA(r00tlee)님이 2016-10-19 10:01에 작성한 댓글입니다.
isql -v Infdrv1
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select 1 from dual;
+------------+
|            |
+------------+
| 1          |
+------------+
SQLRowCount returns -1
1 rows fetched
 
뭔가 된 것 같긴한데? isql 로 해서 1을 조회해보면 SQLRowCount returns -1로 떨어지는건 정상이 아닌 것 같은데 정상이 아닌게 맞는거죠..?
 
그리고 odbc연결해서 해보니.. 뭔가 아까전에는 SQLDriverConnect쪽도 안 넘어갔었는데 지금은 이 부분은 넘어가고 SQLExecDirectError가 발생을 하네요..
 
SQLExecDirect Error      ret : [-1]
HY000:1:4294966947:[Informix][Informix ODBC Driver][Informix]Database not selected yet.
 
분명 sysuser라는 데이터베이스가 존재하는데 왜 이런 메세지가 계속 뜨는지 아직까지 찾아보고 있는 중입니다... 어디가 문제인지 모르겠네요
 
추가적으로 char *connect_string = "DSN=Infdrv1;connectdatabase=NO";
 
NO로 했을 경우 저렇게 나오고요..
YES로 하면 아무 값도 안 나오네요..
 
샘플에는 NO로 default되어 있고요..
초보DBA(r00tlee)님이 2016-10-19 15:06에 작성한 댓글입니다.
이 댓글은 2016-10-19 15:27에 마지막으로 수정되었습니다.

IBM의 예제나 제가 테스트로 실행한 결과를 보시면

SQLRowCount returns -1 메시지는 정상으로 보입니다.

https://www.ibm.com/developerworks/data/library/techarticle/dm-1108odbcdrivermanager/

 

그리고 Database not selected yet 이란 메시지는 데이터베이스 접속이 되지 않았다는 의미입니다.

connectdatabase=NO로 설정된 샘플 소스의 경우는 dbcreate.c (db생성), dbdrop.c (db삭제) 등의 프로그램이며 이런 경우는 데이터베이스 접속을 하지않고 수행하는 작업입니다. 그외의 일반적으로 쿼리를 수행하는 경우에는 connect string에 DSN이름만 지정하여 사용하고 있네요. (샘플 소스는$INFORMIXDIR/demo/cli 에 있습니다)

샘플 프로그램은 odbc.ini의 database를 odbc_demodb로 지정해서 실행해보시고, 작성하신 소스와 비교해 보시면 좋을 것 같습니다.

 

정상규(pajama)님이 2016-10-19 18:11에 작성한 댓글입니다.

문제 해결했습니다. 감사합니다.

select 1 from dual; 을 날려보니.. 쿼리는 에러가 안떨어지는데 결과 값이 아무 것도 없어서..

update는 되나 싶어서 해봤더니.. 되더라고요 그래서

buff에 이상이 있나 싶어서 자세히 보다가..

SQLBindCol 함수쪽 6번째 파라미터 변수 타입이 int로 선언을 해서 문제가 발생했더라고요

SQLLEN타입으로 변경하고 다시 실행하니 잘 되네요..

초보DBA(r00tlee)님이 2016-10-20 10:20에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
3453esql 질문입니다. [2]
goblin
2017-02-13
3811
3452index관련 질문입니다. [1]
이주환
2017-02-08
3939
3451informix 초보입니다. [1]
goblin
2017-01-31
3883
3450informix odbc 연결 관련.. [11]
초보DBA
2016-10-17
5313
3449기존 테이블 (Decimal(4))-> 신규 테이블(Char(4)로 데이터를 옮기는데 질문이 있습니다 ㅠ [1]
ㅠㅠ
2016-10-14
3726
3448특정 칼럼의 여러 row의 값을 1개의 row로 select하는 방법 [2]
송정섭
2016-09-06
4481
3447pl/sql문 관련.. [1]
초보DBA
2016-03-31
4499
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.051초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다