不需要, 
EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
EXEC SQL CONNECT :username IDENTIFIED BY :password;

解决方案 »

  1.   

    1)ORACLE 客户端
    2)服务名
      

  2.   

    我搞了三天了。不行呀各位!!??总是:读出的错误为ORA-03114:Connect error ,can't get error text.    请问楼上:我就连本地库也需要那些吗?以下我写的:EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
            EXEC SQL WHENEVER NOT FOUND GOTO notfound;
    EXEC SQL WHENEVER SQLWARNING GOTO warning;

    cout<<"    开始登录数据库……"<<endl;

    strcpy((char*)username.arr,"ljt");
    username.len=strlen((char*)username.arr);
    strcpy((char*)password.arr,"ljt");
    password.len=strlen((char*)password.arr);

    EXEC SQL CONNECT :username IDENTIFIED BY :password;

    EXEC SQL COMMIT RELEASE;
    cout<<"    成功登录数据库"<<endl;
    return(1);


    sqlerror:
            EXEC SQL WHENEVER SQLERROR CONTINUE;
            EXEC SQL ROLLBACK RELEASE;
            cout<<"    sqlerror:错误"<<endl;
            printf("\nOracle error detected:\n");
            /* Print error message and disconnect from Oracle */
            printf("\n%.70s\n", sqlca.sqlerrm.sqlerrmc);
    return(0);  
      

  3.   

    你是第一次或学写PROC不多吗?如果是的放,你把你的所有的C++代码都移出去,用纯C来写你的这个程序看看,也许就可以编译通过了。你上面的那个连接要求你的程序跑在你的ORACLE服务器上,(或学习时就是你家的机器,你可能是都装在一起了吧)
      

  4.   

    你用下面的代码试一下,代码本身没有问题,如果不能通过,可能是其它的地方还有问题,还没有到编码出错的地方,注意一下,这个小程序要求你的程序跑在ORACLE服务器上,版本817,使用例子中的SCOTT/TIGER/*
     *  sample1.pc
     *
     *  Prompts the user for an employee number,
     *  then queries the emp table for the employee's
     *  name, salary and commission.  Uses indicator
     *  variables (in an indicator struct) to determine
     *  if the commission is NULL.
     *
     */#include <stdio.h>
    #include <string.h>
    /* Define constants for VARCHAR lengths. */
    #define     UNAME_LEN      20
    #define     PWD_LEN        40/* Declare variables.No declare section is needed if MODE=ORACLE.*/
    VARCHAR     username[UNAME_LEN];  
    /* VARCHAR is an Oracle-supplied struct */
    varchar     password[PWD_LEN];    
    /* varchar can be in lower case also. */
    /*
    Define a host structure for the output values of a SELECT statement.
    */
    struct {
        VARCHAR   emp_name[UNAME_LEN];
        float     salary;
        float     commission;
    } emprec;
    /* 
    Define an indicator struct to correspond to the host output struct. */
    struct
    {
        short     emp_name_ind;
        short     sal_ind;
        short     comm_ind;
    } emprec_ind;/*  Input host variable. */
    int         emp_number;
    int         total_queried;
    /* Include the SQL Communications Area.
       You can use #include or EXEC SQL INCLUDE. */
    #include <sqlca.h>/* Declare error handling function. */
    void sql_error();main()
    {
        char temp_char[32];/* Connect to ORACLE--
     * Copy the username into the VARCHAR.
     */
        strncpy((char *) username.arr, "SCOTT", UNAME_LEN);
    /* Set the length component of the VARCHAR. */
        username.len = strlen((char *) username.arr);
    /* Copy the password. */
        strncpy((char *) password.arr, "TIGER", PWD_LEN);
        password.len = strlen((char *) password.arr);
    /* Register sql_error() as the error handler. */
        EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n");/* Connect to ORACLE.  Program will call sql_error()
     * if an error occurs when connecting to the default database.
     */
        EXEC SQL CONNECT :username IDENTIFIED BY :password;
        printf("\nConnected to ORACLE as user: %s\n", username.arr);
    /* Loop, selecting individual employee's results */
        total_queried = 0;
        for (;;)
        {
    /* Break out of the inner loop when a
     * 1403 ("No data found") condition occurs.
     */
            EXEC SQL WHENEVER NOT FOUND DO break;
            for (;;)
            {
                emp_number = 0;
                printf("\nEnter employee number (0 to quit): ");
                gets(temp_char);
                emp_number = atoi(temp_char);
                if (emp_number == 0)
                    break;
                EXEC SQL SELECT ename, sal, NVL(comm, 0)
                    INTO :emprec INDICATOR :emprec_ind
                    FROM EMP
                    WHERE EMPNO = :emp_number;
    /* Print data. */
                printf("\n\nEmployee\tSalary\t\tCommission\n");
                printf("--------\t------\t\t----------\n");
    /* Null-terminate the output string data. */
                emprec.emp_name.arr[emprec.emp_name.len] = '\0';
                printf("%-8s\t%6.2f\t\t",
                    emprec.emp_name.arr, emprec.salary);
                if (emprec_ind.comm_ind == -1)
                    printf("NULL\n");
                else
                    printf("%6.2f\n", emprec.commission);            total_queried++;
            }  /* end inner for (;;) */
            if (emp_number == 0) break;
            printf("\nNot a valid employee number - try again.\n");
        } /* end outer for(;;) */    printf("\n\nTotal rows returned was %d.\n", total_queried); 
        printf("\nG'day.\n\n\n");/* Disconnect from ORACLE. */
        EXEC SQL COMMIT WORK RELEASE;
        exit(0);
    }
    void sql_error(msg)
    char *msg;
    {
        char err_msg[128];
        int buf_len, msg_len;    EXEC SQL WHENEVER SQLERROR CONTINUE;
        printf("\n%s\n", msg);
        buf_len = sizeof (err_msg);
        sqlglm(err_msg, &buf_len, &msg_len);
        printf("%.*s\n", msg_len, err_msg);
        EXEC SQL ROLLBACK RELEASE;
        exit(1);
    }
      

  5.   

    不知道你刚才看没看到我的话,请先不要使用C++代码或C++特性,而一定要用纯C来编,试试先。
      

  6.   

    如果不是在服务器上运行,连接数据库时必须加上服务名.
    即必须配置客户端,建立服务.
    连接时使用 "user/pass@servicename"和"".
      

  7.   

    我是在win2000下用proc,没有特殊要求吧?