首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

连接数据库解决思路

2012-03-11 
连接数据库 我想在unix下写段c程序,要连接数据库(一个oracle还有一个sybase),主要是做查询,有没有现成的co

连接数据库

我想在unix下写段c程序,要连接数据库(一个oracle还有一个sybase),主要是做查询,有没有现成的code???

谢谢大家了

[解决办法]
下面程序是我做的,主要功能是通过客户端发送的数据操作服务器端的数据库,功能上增删插改都有。如果不需要用fork创建子进程可以去掉这段,socket部分也可以去掉,我做的是对DB2做操作,你要用的话要稍微修改下sql语句就行了。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/select.h>

#define CURRATE_LIS_PORT 11110
#define MAXCOMLEN 1024

EXEC SQL INCLUDE SQLCA;
main()
{
int forkId;

if ((forkId = fork ()) == 0) {
signal( SIGHUP, SIG_IGN );
signal( SIGQUIT, SIG_IGN );
signal( SIGINT, SIG_IGN );
signal( SIGCLD, SIG_IGN );
setpgrp();
NetServer (CURRATE_LIS_PORT);
} else if (forkId > 0) {
exit (0);
} else if (forkId < 0) {
printf( "UUcom: fork() error\n ");
exit (-1);
}
}


int NetServer (int SERV_TCP_PORT)
{
int sockfd,lis_sockfd,clilen,childpid;/*sockfd:数据传输socket;lis_sockfd:监听socket*/
struct sockaddr_in cli_addr,serv_addr;

setpgrp ();
signal (SIGINT,SIG_IGN);
signal (SIGCLD,SIG_IGN);
/*
* Open a TCP socket (an Internet Stream socket).
*/
if ((lis_sockfd = socket (AF_INET,SOCK_STREAM,0)) <0)
{
printf( "NetServer: can 't open stream socket\n ");
return (-1);
}

/*
* Bind our local address so that the client cna send to us.
*/
memset ((char *)&serv_addr,0,sizeof (serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl (INADDR_ANY);
serv_addr.sin_port = htons (SERV_TCP_PORT);

if (bind (lis_sockfd, (struct sockaddr *)&serv_addr,sizeof (serv_addr )) <0)
{
perror( "NetServer: can 't bind local address\n ");
return (-1);
}
listen (lis_sockfd, 5);
for (;;)
{
clilen = sizeof (cli_addr);
sockfd = accept (lis_sockfd, (struct sockaddr *)&cli_addr,&clilen);
if (sockfd < 0 )
{
perror( "NetServer: can 't accept connect\n ");
return (-1);
}

if (send(sockfd, "Hello,you are connected!\n ",26,0)==-1)
perror( "send出错! ");

if ((childpid = fork ()) <0)
{
perror( "NetServer: can 't fork\n ");
return (-1);
}
else if (childpid == 0)
{
/* Child process */
close (lis_sockfd);
Con_Access (sockfd);
exit (0);
}

close (sockfd);
}
}


Con_Access(int sockfd)/*处理接受的信息*/
{
/*********************定义变量**********************/
intfunReturn,sendBuffLen,ret=0;
charrcvBuff[ MAXCOMLEN + 1 ];
charsendBuff[MAXCOMLEN + 1 ];
inti,j,k;
charidstr[4];
charnamestr[20];
charphonestr[20];
memset(idstr,0,sizeof(idstr));
memset(namestr,0,sizeof(namestr));
memset(phonestr,0,sizeof(phonestr));


/*************初始化接收缓存和发送缓存区*************/
memset( rcvBuff, 0, sizeof( rcvBuff ) );
memset(sendBuff,0,sizeof(sendBuff));


/******************储存接收DATA*********************/


funReturn = recv (sockfd, rcvBuff, MAXCOMLEN, 0);/*接收数据*/

if (funReturn <= 0)
{
printf( "DaemonCurRate received length incorrect!\n ");
close ( sockfd );
exit (-1);
}
printf( "funReturn=%d\n ",funReturn);

k = rcvBuff[0] - 48;/*转换字符型k为数值型*/

for(i=0;i <funReturn;i++)
{
printf( "inbuffer[%d]=[%c];\n ",i,rcvBuff[i]);/*判断接收缓存区每个数据,并输出*/
}

for (i=1,j=0;i <=3; i++,j++ )/*将接收缓存区的值存入id,name,phone变量*/
{
idstr[j] = rcvBuff[i];
}

for(i=4,j=0;i <=6; i++,j++)
{
namestr[j]=rcvBuff[i];
}

for(i=7,j=0;i <=9; i++,j++)
{
phonestr[j]=rcvBuff[i];
}


/******************连接登录DB*********************/
EXEC SQL begin declare section;/*定义变量*/
char db_name[3]= "sun ";
char user_name[9]= "db2inst1 ";
char user_passwd[7]= "diwise ";
char ID[3+1];
char NAME[3+1];
char PHONE[3+1];
EXEC SQL end declare section;/*定义变量结束*/

memset(ID,0,sizeof(ID));
memset(NAME,0,sizeof(NAME));
memset(PHONE,0,sizeof(PHONE));
strcpy(ID,idstr);/*将缓存区数据变量存入SQL语句变量中*/
strcpy(NAME,namestr);
strcpy(PHONE,phonestr);

EXEC SQL connect to :db_name user :user_name using :user_passwd;

if(sqlca.sqlcode !=0)
{
printf( "[%s][Line:%d] SQL call fail, sqlcode:%d ",__FILE__, __LINE__,sqlca.sqlcode);
}
else
{
printf( "enter DB successfully\n ");
}


/*******************SELECT操作********************/
if ( k == 1)
{
EXEC SQL SELECT NAME,PHONE INTO :NAME,:PHONE FROM SS WHERE ID=:ID;
if(sqlca.sqlcode !=0)
{
printf( "[%s][Line:%d] SQL call fail, sqlcode:%d ",__FILE__, __LINE__,sqlca.sqlcode);
memcpy(sendBuff, "查询数据失败 ",13);
}
else
{
strcpy(namestr,NAME);
strcpy(phonestr,PHONE);
memcpy(sendBuff,strcat(namestr,phonestr),MAXCOMLEN);/*定义sendbuff内容*/
}
}


/*******************INSERT操作*********************/
else if ( k == 2)
{
EXEC SQL INSERT INTO SS(ID, NAME, PHONE) VALUES(:ID, :NAME, :PHONE);
if (sqlca.sqlcode !=0)
{
printf( "[%s][Line:%d] SQL call fail, sqlcode:%d ",__FILE__,__LINE__,sqlca.sqlcode);
memcpy(sendBuff, "插入数据失败 ",13);
}
else
{
memcpy(sendBuff, "插入数据成功 ",13);
}
}


/******************DELETE操作*********************/
else if ( k == 3)
{
EXEC SQL DELETE FROM SS WHERE ID=:ID;
if (sqlca.sqlcode !=0)
{
printf( "[%s][Line:%d] SQL call fail, sqlcode:%d ",__FILE__,__LINE__,sqlca.sqlcode);
memcpy(sendBuff, "删除数据失败 ",13);
}
else
{
memcpy(sendBuff, "删除数据成功 ",13);
}

}


/******************UPDATE操作*********************/
else if ( k == 4)
{
EXEC SQL UPDATE SS SET NAME=:NAME,PHONE=:PHONE WHERE ID=:ID;
if (sqlca.sqlcode !=0)
{
printf( "[%s][Line:%d] SQL call fail, sqlcode:%d ",__FILE__,__LINE__,sqlca.sqlcode);
memcpy(sendBuff, "更新数据失败 ",13);
}
else
{
memcpy(sendBuff, "更新数据成功 ",13);
}
}


/*******************操作符错误**********************/
else
{
memcpy(sendBuff, "操作符描述错误 ",15);
}


/*******************关闭数据库**********************/


if (sqlca.sqlcode != 0)
{
EXEC SQL ROLLBACK;
}
else EXEC SQL COMMIT;

EXEC SQL CONNECT RESET;


/****************向客户端发送数据*******************/
sendBuffLen = strlen( sendBuff );
if(sendBuffLen > MAXCOMLEN)
{
printf( "send length > MAXCOMLEN ,send process only send MAXCOMLEN!\n ");
sendBuffLen = MAXCOMLEN;
}
funReturn = send (sockfd, sendBuff, sendBuffLen, 0);/*发送数据*/

if (funReturn <= 0)
{
printf( "send length incorrect!\n ");
close ( sockfd );
exit (-1);
}
close( sockfd );
exit (0);
}

热点排行