如何在 MSVC 中使用 ECPG

Posted

技术标签:

【中文标题】如何在 MSVC 中使用 ECPG【英文标题】:How to use ECPG in MSVC 【发布时间】:2011-07-15 18:45:27 【问题描述】:

我正处于软件的早期开发阶段,我正在尝试弄清楚如何使用 ecpg。我已经成功地使用 MSVC 2010 构建了 PostgreSQL 9.0.4 并成功构建了一个测试程序以确保其正常工作。 (http://www.linuxjournal.com/content/accessing-postgresql-cc,除了为 Windows 修改。)

但是我不知道如何构建,在源代码中“#include”什么,等等。我发现了很多语法示例,但没有任何关于测试程序或遍历的方式。即使是以前版本 (8.4.x) 中的某些内容也会有所帮助。

【问题讨论】:

【参考方案1】:

AFAIK 首先你需要嵌入式 SQL C 文件(带有pgc 扩展名)。简单例子:

int main(void)

    EXEC SQL BEGIN DECLARE SECTION;
    int ordinaryInt;
    EXEC SQL END DECLARE SECTION;

    EXEC SQL CONNECT TO tcp:postgresql://localhost:5432/postgres AS myconnection USER postgres USING '12345';

    EXEC SQL INSERT INTO t (value) VALUES ('abcdefgj');
    EXEC SQL COMMIT;

    EXEC SQL DISCONNECT myconnection;

    return 0;

连接字符串在doc 中有很好的解释。之后你需要ecpg.exe,把上面的代码转换成众所周知的C代码:

在编译之前通过嵌入式 SQL C 运行文件 预处理器,它将您使用的 SQL 语句转换为特殊的 函数调用。编译后,必须链接一个特殊的库 包含所需的功能。

例如:

"C:\Program Files (x86)\PostgreSQL\9.0\bin\ecpg.exe" -o ecpgTest.c ecpgTest.pgc

您生成的 C 代码如下所示:

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

#line 1 "ecpgTest.pgc"
int main(void)

    /* exec sql begin declare section */


#line 4 "ecpgTest.pgc"
 int ordinaryInt ;
/* exec sql end declare section */
#line 5 "ecpgTest.pgc"


     ECPGconnect(__LINE__, 0, "tcp:postgresql://localhost:5432/postgres" , "postgres" , "'12345'" , "myconnection", 0); 
#line 7 "ecpgTest.pgc"


     ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "insert into t ( value ) values ( 'abcdefgj' )", ECPGt_EOIT, ECPGt_EORT);
#line 9 "ecpgTest.pgc"

     ECPGtrans(__LINE__, NULL, "commit");
#line 10 "ecpgTest.pgc"


     ECPGdisconnect(__LINE__, "myconnection");
#line 12 "ecpgTest.pgc"


    return 0;

在附加包含目录中添加C:\Program Files (x86)\PostgreSQL\9.0\include 路径(配置属性→ C/C++)并将libecpg.lib 放入附加依赖项(链接器→ 输入)可能您需要将C:\Program Files (x86)\PostgreSQL\9.0\lib 路径添加到附加库目录中(链接器→ 常规) 然后您就可以开始了(请注意,一些 DLL 位于 C:\Program Files (x86)\PostgreSQL\9.0\bin)。

【讨论】:

谢谢,我会在本周晚些时候试一试,然后告诉你进展如何。 我对 PostgressSQL 11 执行完全相同的步骤,但在构建项目时出现错误 LNK2019 unresolved external symbol _ECPGconnect referenced in function _main。有什么我可能会丢失的吗?我已经能够使用“*.pgc”预编译该文件。

以上是关于如何在 MSVC 中使用 ECPG的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 MSVC 在 C++ 中定义外部 C 结构返回函数?

如何使用 msvc 2019 编译 QT 4 dll?

msvc2010 - 如何建立一个干净的输出目录?

在 MSYS 环境中使用 MSVC 工具链(例如:CL.EXE)时,如何避免“未解析的外部符号 _mainCRTStartup”错误?

lambda 如何在 MSVC2017 15.9.3 中使用 /std:c++17 中的静态局部错误返回值?

如何在 MSVC++6 中声明 IEEE 数学函数,如“ilogbf”?