4

ラップトップでpostgresqlサーバーを使用しており、epcgを使用してCプログラムを介してデータベースに接続しようとしています。プログラムをプリコンパイル、コンパイル、実行するために、次のコマンドを作成しました.pgc

PRE-COMPIILE - epcg sql.pgc  
COMPILE -   gcc -c sql.c -I/usr/include/postgresql   
RUN -  gcc -o sql sql.o -L/usr/lib -lecpg

私のプログラムはコンパイルされて正常に実行されています。つまり、エラーは表示されていません。
しかし、コマンドラインプロンプトで
コマンドCOMMAND- psqldatabase を使用してデータベースを取得しようとすると、

テーブルに更新がありません。つまり、プログラムで作成したコマンドがデータベースで更新されていません。

以下は.pgcファイル内のコードです:

#include<stdio.h>


int main()
{


    EXEC SQL CONNECT TO database;

    EXEC SQL create table player(player_id int,player_name varchar(255),team varchar(10));
    EXEC SQL create table player1(player_id int,player_name varchar(255),team varchar(10));
    EXEC SQL INSERT INTO player VALUES(1,'ram','a');

    EXEC SQL COMMIT;

    EXEC SQL DISCONNECT database;

    return 0;
}  

以下は、プリコンパイル後のCのコードです。

/* Processed by ecpg (4.7.0) */
/* These include files are added by the preprocessor */
#include <ecpglib.h>
#include <ecpgerrno.h>
#include <sqlca.h>
/* End of automatic include section */

#line 1 "sql.pgc"
#include<stdio.h>

int main()
{
    { ECPGconnect(__LINE__, 0, "vidisha@localhost:5432" , NULL, NULL , NULL, 0); }
#line 8 "sql.pgc"
    { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table player ( player_id int , player_name varchar ( 255 ) , team varchar ( 10 ) )", ECPGt_EOIT, ECPGt_EORT);}
#line 10 "sql.pgc"
    { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table player1 ( player_id int , player_name varchar ( 255 ) , team varchar ( 10 ) )", ECPGt_EOIT, ECPGt_EORT);}
#line 11 "sql.pgc"
    { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into player values ( 1 , 'ram' , 'a' )", ECPGt_EOIT, ECPGt_EORT);}
#line 12 "sql.pgc"
    { ECPGtrans(__LINE__, NULL, "commit");}
#line 14 "sql.pgc"
    { ECPGdisconnect(__LINE__, "vidisha");}
#line 16 "sql.pgc"
    return 0;
}
4

3 に答える 3

1

あなたが書いたスクリプトを使用しても、テスト DB には何の変更もありませんでした。

したがって、@vector のアドバイスを使用して、テスト DB のユーザー名を指定すると、すべてが機能します。

これを使用してmakefile

default:
    ecpg sql.pgc
    gcc -c sql.c -I/usr/include/postgresql
    gcc -o sql sql.o -L/usr/lib -lecpg

そして、例として、私は使用します:

  • testdbデータベース名として
  • 9876ポートとして
  • testuserユーザー名として
  • testpassパスワードとして

これでsql.pgc

#include <stdio.h>

int main() {
    EXEC SQL CONNECT TO testdb@localhost:9876 USER 'testuser' IDENTIFIED BY 'testpass';

    EXEC SQL create table player(player_id int,player_name varchar(255),team varchar(10));
    EXEC SQL create table player1(player_id int,player_name varchar(255),team varchar(10));
    EXEC SQL INSERT INTO player VALUES(1,'ram','a');

    EXEC SQL COMMIT;

    EXEC SQL DISCONNECT;

    return 0;
}

すべてがうまくいきました。

于 2012-09-04T15:52:16.123 に答える
1

パスワードも入力する必要があり、デフォルトのポートは 5432 です。このコードは私にとっては問題なく動作します。 testdb- databaseName, postgres - username, 123321 - password

_また、このプログラムを一度実行した後、両方の create table 行を削除する必要があります。そうしないと、コードが機能しません (テーブルは既に作成されているため)。エラー処理を行っていないため、エラーは発生しません。エラー処理などの詳細については、ここをクリックしてください。_

#include<stdio.h>


int main()
{


    EXEC SQL CONNECT TO testdb@localhost:5432 USER 'postgres' USING '123321';

    EXEC SQL create table player(player_id int,player_name varchar(255),team varchar(10));
    EXEC SQL create table player1(player_id int,player_name varchar(255),team varchar(10));
    EXEC SQL INSERT INTO player VALUES(1,'ram','a');

    EXEC SQL COMMIT;

    EXEC SQL DISCONNECT database;

    return 0;
}
于 2012-09-04T19:04:16.560 に答える
0

検索パスを現在のデータベースに設定する必要があります。

EXEC SQL SET SEARCH_PATH TO "your database";

また、最後にコミットすることを忘れないでください。

EXEC SQL COMMIT;
于 2017-04-14T15:45:39.547 に答える