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
운영게시판
최근게시물
MySQL Q&A 22438 게시물 읽기
No. 22438
mysql c api 에서요 에러나는 부분이요
작성자
won
작성일
2004-09-22 15:23
조회수
1,278

다른것이 아니라요 query= "INSERT INTO ControlTab (`StbId`,`IPAddr`,`CntDate`,`CntTime`,`Port`)
VALUES(4, '211.61.235.23', 'cntdate()', 'cnttime()', '5555')";

이부분을 쿼리 처리하면 그대로 테이블에 저장 되거든요

문제는 위에 값을 변수로 받아서 처리해야 하는데요 자꾸 안됩니다.

query= "INSERT INTO ControlTab (`StbId`,`IPAddr`,`CntDate`,`CntTime`,`Port`)

VALUES(%d,'%s','curdate','curtime','%s'),

numtotal,inet_ntoa(echoClntAddr.sin_addr),ntohs(echoClntAddr.sin_port)";

 

제가 c api 를 잘몰라서 그러는건지 실행하면 에러가 나더라고요 segmetaion fault
numtotal,inet_ntoa(echoClntAddr.sin_addr),ntohs(echoClntAddr.sin_port) 이것은 위에서 전역변수로 선언해서

처리해주었고요 통신 프로그램하고 같이 쓰려고 한것입니다.

/* sprintf(query,"INSERT INTO ControlTab
VALUES (%d,'%s', 'curdate()', 'curtime()','%s','' )",
numtotal,inet_ntoa(echoClntAddr.sin_addr),ntohs(echoClntAddr.sin_port));
*/
위에 방법으로 해보아도 안됩니다. 어떤 방식으로 해야 하는지요

위의 3가지 변수를 받고요 아 그리고 날짜 ,시간 을 해줘야 하는데 어떻게 해주어야 하는지

날짜 시간은

mysql c 로 하신분 답변좀 부탁합니다.

 

 

 

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

 

쿼리문 중에서 VALUES 안에 있는 것들을 보면

 

%d, '%s', 'curdate', 'curtime', '%s'

 

라고 되어 있는데,

 

첫번째 두번째 인자값인, numtotal 은 정수니깐 %d 가 맞고, inet_ntoa 의 리턴값은 캐릭터 포인터니깐 역시 %s 가 맞는데 세번째 ntohs 는 리턴값이 unsigned short 니깐 정수 입니다. 그러니 마지막 부분을 %s -> %d 로 바꿔주세요. (정수로 리턴되는 값을 포인터로 여겨서 문자열로 집어 넣을려고 하니 당연히 segment fault 가 발생하겠죠?)

더 세밀하게 한다면 %d 가 아니라 %u 가 맞겠지만 그건 상관 없을 것 같습니다.

 

그러니깐 수정하면,

 

query= "INSERT INTO ControlTab (`StbId`,`IPAddr`,`CntDate`,`CntTime`,`Port`)

VALUES(%d,'%s','curdate','curtime',%d),

numtotal,inet_ntoa(echoClntAddr.sin_addr),ntohs(echoClntAddr.sin_port)";

 

가 되겠네요 VALUES 의 () 안에 마지막 부분이 '%s' 에서 %d 로 바뀐것만 다릅니다.

 

그리고 이건 제가 mysql 을 지금 사용하지 않고 있어서 확인이 좀 곤란한데 INSERT INTO ControlTab('Stbld', ...) 이부분에서 필드명을 '' 으로 감싸도 되는 건가요? 예전에 사용할땐 그렇게 안써서..

 

그건 그렇고 위처럼 했는데도 똑같은 에러가 난다면 inet_ntoa 함수가 혹시 NULL 을 리턴하지 않는지 확인해보세요..

 

박태수(Diode)님이 2004-09-23 11:02에 작성한 댓글입니다.
이 댓글은 2004-09-23 11:22에 마지막으로 수정되었습니다.

답변 감사합니다. 음 우선 정확히 지적해 주셨습니다.

제가 그부분들을 해결하고 이글을 읽어보았는데

답변 내용과 비슷합니다. 문제는 형타입이이었습니다.

저는 이렇게 했습니다.

#define INSERT_QUERY "INSERT INTO ControlTab (StbId,IPAddr,CntDate,CntTime,Port) VALUES ( '%s', '%s', '%s', '%s',%d)"

 

위에다 정의해주고 본문에서

sprintf(query,INSERT_QUERY,
                    filename,inet_ntoa(echoClntAddr.sin_addr),buffer1,buffer,ntohs(echoClntAddr.sin_port));  이렇게 했더니 file name,ip하고 포트번호는 잘나옵니다. 혹시 날짜와시간관련해서

mysql c 로 날짜 따로 시간따로 왜냐면 웹에서 필드를

두개로 나누어서리 즉 buffer1 이 날짜라고 2004-90-23  이런식이고 buffer 에는 시간 17:35:48 요런식으로

할려고 하는 데 이상하게 쿼리에 전달이 안되더군요

시스템 프로그래밍중 시간관련해서 변수값을 전달했는데 콘솔상에서는 잘보이는데 쿼리에서는 안보여요

printf("receive time=%s",buffer);

원래 이렇게 하면요 날짜 하고 시간이 붙어서 나오거든요 그래서 mysql 에서 자체적으로나 아니면 c 함수로 분리시켜서 2개로 전달해서 쿼리에 입력 하는방법

부탁합니다. 에공 추석전까지 해야하는데 아무튼 관심들 가져주셔서 감사합니다. 추석 명절 잘보내십시요

 

 

won님이 2004-09-23 17:57에 작성한 댓글입니다. Edit

그거는 걍... 문자열 파싱 문제인것 같은데요..

 

하는 방법은 무수히 많겠지만;;;

 

일단 문자열을 담을 변수 두개를 선언하고

 

날짜 하고 시간 중간에 공백 (스페이스 = 0x20) 이 있으면 첫번째 문자열에 바로 전까지 복사한 다음에 널문자 붙이고 다음 변수에 나머지 뒷부분 복사할 수도 있고..

 

하여간 그건 방법이 워낙에 무수히 많은지라.. ^^;

 

박태수(Diode)님이 2004-09-23 18:55에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
22441간단한거 같은디 생각이 안납니다. 쿼리 [1]
최종우
2004-09-23
897
22440mysql에서 table name으로 "grant#"을 사용할수 없나요(예약어)? [1]
강호영
2004-09-22
915
22439foreign key 생성 [1]
오동섭
2004-09-22
2152
22438mysql c api 에서요 에러나는 부분이요 [3]
won
2004-09-22
1278
22437MySQL 원격접속 설정
이대근
2004-09-22
2183
22436시간대별 데이터를 보여주려면 어떻게 하면 되는것인지요? [1]
김민정
2004-09-22
1629
22435너무나 황당한 DB CONNECT ERROR 도와주세요!! [1]
비의비
2004-09-22
1367
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다