PostgreSQL ecpg程序没有';t将更改保存到数据库

PostgreSQL ecpg程序没有';t将更改保存到数据库,c,database,postgresql,ecpg,C,Database,Postgresql,Ecpg,我正在笔记本电脑上使用postgresql server,并试图通过我的C程序(使用epcg)与数据库连接。我编写了以下命令来预编译、编译和运行my.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 我的程序已成功编译并运行,即未显示任何错误。 但是,当我尝试在命令行提示符下使用命令

我正在笔记本电脑上使用postgresql server,并试图通过我的C程序(使用epcg)与数据库连接。我编写了以下命令来预编译、编译和运行my
.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
我的程序已成功编译并运行,即未显示任何错误。
但是,当我尝试在命令行提示符下使用命令检索数据库时,
命令-
psql
数据库

表中没有更新,即我在程序中编写的命令在数据库中没有更新

以下是
.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;
}  
#包括
int main()
{
execsql连接到数据库;
execsqlcreatetableplayer(player_id int,player_name varchar(255),teamvarchar(10));
execsqlcreatetableplayer1(player_id int,player_name varchar(255),teamvarchar(10));
EXEC SQL插入到播放器值中(1,'ram','a');
execsqlcommit;
execsql数据库;
返回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;
}
/*由ecpg处理(4.7.0)*/
/*这些包含文件是由预处理器添加的*/
#包括
#包括
#包括
/*自动包含段结束*/
#第1行“sql.pgc”
#包括
int main()
{
{ECPGconnect(uuuu线,0,“vidisha@localhost:5432“,空,空,空,0);}
#第8行“sql.pgc”
{ECPGdo(uuu LINE_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu0,1,NULL,0,ECPGst_normal,“创建表播放器(播放器id int,播放器名称varchar(255),团队varchar(10)),ECPGt_EOIT,ECPGt_EORT);}
#第10行“sql.pgc”
{ECPGdo(uuu LINE_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu0,1,NULL,0,ECPGst_uuNormal,“创建表播放器1(播放器id int,播放器名称varchar(255),团队varchar(10)),ECPGt_EOIT,ECPGt_EORT);}
#第11行“sql.pgc”
{ECPGdo(uuu LINE_uuuuuu,0,1,NULL,0,ECPGst_normal,“插入到播放器值(1,'ram','a')”,ECPGt_EOIT,ECPGt_EORT);}
#第12行“sql.pgc”
{ECPGtrans(_行,NULL,“提交”);}
#第14行“sql.pgc”
{ECPGdisconnect(uuu LINE_uuuuuu,“vidisha”);}
#第16行“sql.pgc”
返回0;
}

使用您编写的脚本,我的测试数据库也没有任何更改

因此,使用@vector advice,如果我给出了测试数据库的用户名,那么一切都会正常工作:

使用此
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;
}
#包括
int main(){
EXEC SQL连接到testdb@localhost:9876由“testpass”标识的用户“testuser”;
execsqlcreatetableplayer(player_id int,player_name varchar(255),teamvarchar(10));
execsqlcreatetableplayer1(player_id int,player_name varchar(255),teamvarchar(10));
EXEC SQL插入到播放器值中(1,'ram','a');
execsqlcommit;
execsql断开连接;
返回0;
}

一切正常。

您还必须提供密码,默认端口为5432。 这个代码对我来说很好用。
testdb-databaseName,postgres-username,123321-password

_此外,在执行此程序后,您必须删除两个创建表行,否则代码将无法工作(因为表已经创建)。您将不会得到错误,因为您没有进行错误处理。要了解错误处理和更多信息,请单击_

#包括
int main()
{
EXEC SQL连接到testdb@localhost:5432用户“postgres”使用“123321”;
execsqlcreatetableplayer(player_id int,player_name varchar(255),teamvarchar(10));
execsqlcreatetableplayer1(player_id int,player_name varchar(255),teamvarchar(10));
EXEC SQL插入到播放器值中(1,'ram','a');
execsqlcommit;
execsql数据库;
返回0;
}

您必须设置当前数据库的搜索路径

EXEC SQL SET SEARCH_PATH TO "your database";
最后,别忘了承诺

EXEC SQL COMMIT;

您确定程序实际上正在连接到数据库吗?您的预编译行应该使用
ecpg
而不是
epcg
。感谢您的回复,我尝试了您提出的解决方案,但仍然不起作用。我猜,它没有连接到数据库。我现在该怎么办?我的例子中没有提到密码的使用。也许这就是你的案子所缺少的。我使用了一个没有它的测试数据库…这表明这里省略了一些非常重要的错误处理和状态检查。程序不应该盲目地继续出错。因为这只是一个测试程序,错误处理和状态检查是下一步要做的。
EXEC SQL COMMIT;