Thread: Regarding PL/SQL with C

Regarding PL/SQL with C

From
Krishnaprasad
Date:
Dear All,

          Iam a newbiw to PL/SQL. So iam having a query regarding
accessing PL/SQL through C program.

I have written code for connecting to a database and select one row and
just print it out.. Iam able to make a connection with the databse. But
after connection it is showing that select query failed.... but if iam
directly selecting through PL/SQL prompt iam able to do the same.......

I have attached the source file also.........

thanks & regards
krishnaprasd

-

#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>

        int
        main()
        {
            char        state_code[3];
            char        query_string[256];
            PGconn     *conn;
            PGresult   *res;
            int         i;

        conn = PQconnectStart("user=postgres,dbname=krishna");

        switch(PQstatus(conn))
        {
            case CONNECTION_MADE:
                printf("Connection established\n");
                break;
            case CONNECTION_BAD:
                printf("Connection error\n");
                break;
            default:
                printf("No choice\n");
        }

            sprintf(query_string,"SELECT * from prasad");

           res = PQexec (conn,query_string);


            if (PQresultStatus(res) != PGRES_TUPLES_OK)
            {
                fprintf(stderr, "SELECT query failed.\n");
                PQclear(res);
                PQfinish(conn);
                exit(1);
            }

            for (i = 0; i < PQntuples(res); i++)
                printf("%s\n", PQgetvalue(res, i, 0));

            PQclear(res);

            PQfinish(conn);

            return 0;
        }

Re: Regarding PL/SQL with C

From
Michael Fuhr
Date:
On Sat, Feb 25, 2006 at 02:03:51PM +0530, Krishnaprasad wrote:
> I have written code for connecting to a database and select one row and
> just print it out.. Iam able to make a connection with the databse. But
> after connection it is showing that select query failed.... but if iam
> directly selecting through PL/SQL prompt iam able to do the same.......

You're connecting to the database thusly:

>   conn = PQconnectStart("user=postgres,dbname=krishna");

Parameters in the connect string should be space-separated, not
comma-separated.  The select is probably failing because the connect
failed; you're not seeing the connection failure because you're
calling PQconnectStart to make a nonblocking connection and you're
not waiting for the connection to complete before making the query.
Unless you need a nonblocking connection use PQconnectdb instead:

    conn = PQconnectdb("user=postgres dbname=krishna");

Then check for CONNECTION_OK, not CONNECTION_MADE.

When an operation has failed, you can use PQerrorMessage or
PQresultErrorMessage to display the reason.

--
Michael Fuhr

Re: Regarding PL/SQL with C

From
Krishnaprasad
Date:
hi michael

          thanks for ur input... I tried with *PQconnectdb* also. But
still it is showing connection error
when I tried with PQErrorMessage it is coming as below.

*FATAL:  IDENT authentication failed for user "postgres" ...

pls help..

thanks
krishna
*
Michael Fuhr wrote:

>On Sat, Feb 25, 2006 at 02:03:51PM +0530, Krishnaprasad wrote:
>
>
>>I have written code for connecting to a database and select one row and
>>just print it out.. Iam able to make a connection with the databse. But
>>after connection it is showing that select query failed.... but if iam
>>directly selecting through PL/SQL prompt iam able to do the same.......
>>
>>
>
>You're connecting to the database thusly:
>
>
>
>>  conn = PQconnectStart("user=postgres,dbname=krishna");
>>
>>
>
>Parameters in the connect string should be space-separated, not
>comma-separated.  The select is probably failing because the connect
>failed; you're not seeing the connection failure because you're
>calling PQconnectStart to make a nonblocking connection and you're
>not waiting for the connection to complete before making the query.
>Unless you need a nonblocking connection use PQconnectdb instead:
>
>    conn = PQconnectdb("user=postgres dbname=krishna");
>
>Then check for CONNECTION_OK, not CONNECTION_MADE.
>
>When an operation has failed, you can use PQerrorMessage or
>PQresultErrorMessage to display the reason.
>
>
>


--
Rgds

KRISHNAPRASAD.K
R&D Engineer
HCL INFOSYSTEMS LTD
PONDICHERRY
Mob:09894530948


Re: Regarding PL/SQL with C

From
Michael Fuhr
Date:
On Mon, Feb 27, 2006 at 09:24:33AM +0530, Krishnaprasad wrote:
>          thanks for ur input... I tried with *PQconnectdb* also. But
> still it is showing connection error
> when I tried with PQErrorMessage it is coming as below.
>
> *FATAL:  IDENT authentication failed for user "postgres" ...

What operating system user is the program running as?  What connect
string are you using now (the previous one was erroneous)?  Does
pg_hba.conf have an ident map that would allow the operating system
user to connect to the specified database as the specified database
user?

If you're not sure how to check pg_hba.conf then see the "Client
Authentication" chapter in the documentation, in particular the
"Ident-based authentication" section:

http://www.postgresql.org/docs/8.1/interactive/client-authentication.html
http://www.postgresql.org/docs/8.1/interactive/auth-methods.html#AUTH-IDENT

--
Michael Fuhr