我已经使用我的 C 应用程序成功连接并从 Postgresql 获取数据。我的connector.pgc
文件如下所示:
#include <stdlib.h>
#include <stdio.h>
//#include "connect.h" // PROBLEM
int connect(); //NO PROBLEM
EXEC SQL BEGIN DECLARE SECTION;
char dbname[1024];
const char *target = "dbname@host:port";
const char *user = "user";
const char *passwd = "password";
EXEC SQL END DECLARE SECTION;
int main() {
EXEC SQL CONNECT TO :target AS con1 USER :user USING :passwd;
EXEC SQL SELECT pg_catalog.set_config('search_path', 'schema_name', false); EXEC SQL COMMIT;
EXEC SQL SET CONNECTION con1;
EXEC SQL SELECT current_database() INTO :dbname;
printf("current database is '%s'\n", dbname);
EXEC SQL DISCONNECT ALL;
// connect();
return 0;
}
// PROBLEM
//int connect(){
// printf("A\n");
// return 0;
//}
当然,除了用户名/密码/schema_name/等。替换为实际值。然后我执行以下操作:
ecpg connector.pgc && gcc connector.c -o connectorXec -lecpg -L/usr/pgsql-12/lib && ./connectorXec
我的操作系统是默认的CentOS 8。
ecpg --version
返回ecpg (PostgreSQL) 13.2
psql --version
返回psql (PostgreSQL) 12.8
该程序编译良好,我可以毫无问题地连接,我知道这是printf提取正确的数据库名称的方式,并且我还运行了其他 SQL SELECTS 来确认数据。
但是,一旦我取消注释该int connect()
函数,即使不使用它,它也会在实际程序之前被调用 3 次,我不知道为什么。更准确地说,我看到字母 A 被打印了 3 次。此外,printf不再显示正确的名称,而是dbname
为空。
我尝试将int connect()
函数放到一个单独的connect.c
文件中,然后通过 将它与这个程序链接在一起,connect.h
结果是一样的。
如果我将内容main()
放入connect()
,然后调用它,则该过程将无限期挂起。
真的,我很茫然,我什至不知道从哪里开始,因为这种情况似乎是不可能的。我检查了connector.c
ECPG 生成的文件,没有其他调用。我可以在网上找到的大多数参考资料只包含 main() 函数,在极少数情况下它们不包含,没有提到任何远程类似的问题。
关于发生了什么的任何想法?