Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ PQprepare和PQexecPrepared用法_C++_Postgresql_Libpq - Fatal编程技术网

C++ PQprepare和PQexecPrepared用法

C++ PQprepare和PQexecPrepared用法,c++,postgresql,libpq,C++,Postgresql,Libpq,希望有人能帮助我使用PQprepare和PQexecPrepared。我肯定我一定出了什么问题,但我尝试的方法似乎都不管用 我试图使用一个准备好的查询插入到一个表中,但我一直遇到这个错误 错误:整数的输入语法无效:“50.2000008” 这是纬度的值,我已经将Oid设置为701(float8),但它表示这是一个整数。我是完全错过了什么,还是有什么不对劲 bool database::AddDataRow(int datasetid, string readingdatetime, float

希望有人能帮助我使用PQprepare和PQexecPrepared。我肯定我一定出了什么问题,但我尝试的方法似乎都不管用

我试图使用一个准备好的查询插入到一个表中,但我一直遇到这个错误

错误:整数的输入语法无效:“50.2000008”

这是纬度的值,我已经将Oid设置为701(float8),但它表示这是一个整数。我是完全错过了什么,还是有什么不对劲

bool database::AddDataRow(int datasetid, string readingdatetime, float depth, float value, float latitude, float longitude) {
    //data_plus

    const char* stmtName = "PREPARE_DATA_PLUS_INSERT";
    Oid oidTypes[6] = {23, 1114, 701, 701, 701, 701};
    int paramFormats[6] = {0, 0, 0, 0, 0, 0};
    PGresult* stmt = PQprepare(
            conn,
            stmtName,
            "INSERT INTO data_plus(datasetid, readingdatetime, depth, value, uploaddatetime, longitude, latitude)"
            "VALUES ($1, $2, $3, $4, NOW(), $5, $6);",
            6,
            (const Oid *) oidTypes
            );

    cout << PQresultErrorMessage(stmt) << " Test";

    const char* paramValues[6];
    int paramLengths[6];

    paramValues[0] = lexical_cast<string>(datasetid).c_str();
    paramValues[1] = readingdatetime.c_str();
    paramValues[2] = lexical_cast<string>(depth).c_str();
    paramValues[3] = lexical_cast<string>(value).c_str();
    paramValues[4] = lexical_cast<string>(longitude).c_str();
    paramValues[5] = lexical_cast<string>(latitude).c_str();

    paramLengths[0] = strlen (paramValues[0]);
    paramLengths[1] = strlen (paramValues[1]);
    paramLengths[2] = strlen (paramValues[2]);
    paramLengths[3] = strlen (paramValues[3]);
    paramLengths[4] = strlen (paramValues[4]);
    paramLengths[5] = strlen (paramValues[5]);

    PGresult* test = PQexecPrepared(conn,
            stmtName,
            6,
            paramValues,
            paramLengths, 
            paramFormats,
            0);

    cout << PQresultErrorMessage(test);

    PQclear(test);
    PQclear(stmt);
}
谢谢


标记尝试为
oidTypes
传递空值,并让服务器推断数据类型

手册上说:

如果
paramTypes
NULL
,或者数组中的任何特定元素为零,则服务器将以与非类型化文字字符串相同的方式为参数符号分配数据类型

。。。只要表被适当地定义,就不应该存在任何推断这些类型的问题

您还可以为
paramFormats
传递
NULL
,因为默认设置是假定所有参数都是文本而不是二进制


使用文本格式参数时,
paramLength
不有用或不需要。将其保留为空。这实际上可能是问题的原因。

错误的原因很可能根本不在显示的代码中,代码本身看起来正常

data\u plus
不是表,它是根据
\d data\u plus
输出的第一行的视图。 因此,可能有一个
规则
或一个
而不是
触发器来执行实际的插入。 另外还有一个
id
列,您的代码没有填写该列,所以它也在其他地方完成


您可能希望关注该代码,并检查传输到其中的列和值之间是否存在任何混淆。

这是一个相当古老的线程,但我仍然会回答,因为其他人可能会看到它。就libpq调用而言,这里的一切似乎都很好,但问题在于以下代码:

const char* paramValues[6];
int paramLengths[6];

paramValues[0] = lexical_cast<string>(datasetid).c_str();
const char*paramValues[6];
int参数长度[6];
paramValues[0]=词法转换(datasetid).c_str();
词法转换返回一个临时std::string,并且您正在保存一个指向将被/被销毁的字符串的指针。 需要将这些字符串保存到某个位置,或者将memcpy数据保存到paramValues(稍后将其删除)。大概是这样的:

std::array<std::string, 6> temp_params;
temp_params[0] = lexical_cast<string>(datasetid);
paramValues[0] = temp_params[0].c_str();
std::数组温度参数;
temp_params[0]=词汇转换(datasetid);
paramValues[0]=temp_params[0].c_str();

使用
libpqtypes
将为您节省不少麻烦。您是否确定701是数据库中
float8
的正确oid(应该是,看起来很长时间以来一直是701,但还是要检查)?你不应该硬编码;团队努力使它们保持稳定,但在程序启动期间,您确实应该从
pg\u type
中查找它们。请在
psql
中显示
\d data\u plus
的输出。如果您将其作为一个自包含的可编译示例,可能会很方便。添加了
\d data\u plus
的输出。我确实检查了我的数据库,它肯定是701 for float8将检查
libpqtypes
谢谢你的建议。你是如何解决这个问题的?我也面临着同样的问题。感谢您的建议,我尝试将它们全部设置为
NULL
仍然会导致出现相同的错误。@MarkDavidson-Odd。自包含的可编译示例+sql来定义表?考虑到结果对我来说没有多大意义,很难继续下去。除非我错过了一些明显的东西。
std::array<std::string, 6> temp_params;
temp_params[0] = lexical_cast<string>(datasetid);
paramValues[0] = temp_params[0].c_str();