sco informix 里怎样使用detach
父进程打开了数据库,fork()后子进程,为什么不能操作数据库,停在哪里,据说要用detach ,怎么用呢? detach 跟..............没看明白~~ 也就是多进程怎么操作数据库. sqldetach ()是个函数 informix 自带例子.......................................
$INFORMIXDIR/demo/esqlc/sqldetach.ec
/****************************************************************************
*
* IBM INC.
*
* PROPRIETARY DATA
*
* Licensed Material - Property Of IBM
*
* "Restricted Materials of IBM"
*
* IBM Informix Client SDK
*
* (c)Copyright IBM Corporation 2002. All rights reserved.
*
****************************************************************************
*/
main()
{
EXEC SQL BEGIN DECLARE SECTION;
mint pa;
EXEC SQL END DECLARE SECTION;
printf("SQLDETACH Sample ESQL Program running.\n\n");
printf("Beginning execution of parent process.\n\n");
printf("Connecting to default server...\n");
EXEC SQL connect to default;
chk("CONNECT");
printf("\n");
printf("Creating database 'aa'...\n");
EXEC SQL create database aa;
chk("CREATE DATABASE");
printf("\n");
printf("Creating table 'tab1'...\n");
EXEC SQL create table tab1 (a integer);
chk("CREATE TABLE");
printf("\n");
printf("Inserting 4 rows into 'tab1'...\n");
EXEC SQL insert into tab1 values (1);
chk("INSERT #1");
EXEC SQL insert into tab1 values (2);
chk("INSERT #2");
EXEC SQL insert into tab1 values (3);
chk("INSERT #3");
EXEC SQL insert into tab1 values (4);
chk("INSERT #4");
printf("\n");
printf("Selecting rows from 'tab1' table...\n");
EXEC SQL declare c cursor for select * from tab1;
chk("DECLARE");
EXEC SQL open c;
chk("OPEN");
printf("\nForking child process...\n");
fork_child();
printf("\nFetching row from cursor 'c'...\n");
EXEC SQL fetch c into $pa;
chk("Parent FETCH");
if (sqlca.sqlcode == 0)
printf("Value selected from 'c' = %d.\n", pa);
printf("\n");
printf("Cleaning up...\n");
EXEC SQL close database;
chk("CLOSE DATABASE");
EXEC SQL drop database aa;
chk("DROP DATABASE");
EXEC SQL disconnect all;
chk("DISCONNECT");
printf("\nEnding execution of parent process.\n");
printf("\nSQLDETACH Sample Program over.\n\n");
}
fork_child()
{
mint rc, status, pid;
EXEC SQL BEGIN DECLARE SECTION;
mint cnt, ca;
EXEC SQL END DECLARE SECTION;
pid = fork();
if (pid < 0)
printf("can't fork child.\n");
else if (pid == 0)
{
printf("\n**********************************************\n");
printf("* Beginning execution of child process.\n");
rc = sqldetach();
printf("* sqldetach() call returns %d.\n", rc);
/* Verify that the child is not longer using the parent's
* connection and has not inherited the parent's connection
* environment.
*/
printf("* Trying to fetch row from cursor 'c'...\n");
EXEC SQL fetch c into $ca;
chk("* Child FETCH");
if (sqlca.sqlcode == 0)
printf("* Value from 'c' = %d.\n", ca);
/* startup a connection for the child, since
* it doesn't have one.
*/
printf("\n* Establish a connection, since child doesn't have one\n");
printf("* Connecting to database 'aa'...\n");
EXEC SQL connect to 'aa';
chk("* CONNECT");
printf("* \n");
printf("* Determining number of rows in 'tab1'...\n");
EXEC SQL select count(*) into $cnt from tab1;
chk("* SELECT");
if (sqlca.sqlcode == 0)
printf("* Number of entries in 'tab1' =%d.\n", cnt);
printf("* \n");
printf("* Disconnecting from 'aa' database...\n");
EXEC SQL disconnect current;
chk("* DISCONNECT");
printf("* \n");
printf("* Ending execution of child process.\n");
printf("**********************************************\n");
exit();
}
/* wait for child process to finish */
while ((rc = wait(&status)) != pid && rc != -1);
}
chk(s)
char *s;
{
mint msglen;
char buf1, buf2;
if (SQLCODE == 0)
{
printf("%s was successful\n", s);
return;
}
printf("\n%s:\n", s);
if (SQLCODE)
{
printf("\tSQLCODE =%6d: ", SQLCODE);
rgetlmsg(SQLCODE, buf1, sizeof(buf1), &msglen);
sprintf(buf2, buf1, sqlca.sqlerrm);
printf(buf2);
if (sqlca.sqlerrd)
{
printf("\tISAM Error =%6hd: ", sqlca.sqlerrd);
rgetlmsg(sqlca.sqlerrd, buf1, sizeof(buf1), &msglen);
sprintf(buf2, buf1, sqlca.sqlerrm);
printf(buf2);
}
}
}
页:
[1]