如果我给定的占位符为$1::text
,这是否意味着我传递给paramValues
的相应PQexecPrepared()
必须是C样式的字符串?到目前为止,我已经这样做了,到目前为止,它已经成功了。 (到目前为止,我需要给::text
加上占位符,否则会出错)。但是,如果我将占位符声明为$1:int
怎么办?我还能在paramValues
中提供C样式的字符串吗? 应该我给出一个C风格的字符串吗? docs on this含糊不清,目前尚不清楚我该如何使用paramTypes
的{{1}}的{{1}}参数来做什么。
更重要的是,如果我需要表达一个数组,例如PQprepare()
,该怎么办?文档对此一无所获,到目前为止,我所见过的解决方案似乎效率不高甚至不可靠,例如https://stackoverflow.com/a/36930781/1676382。到目前为止,我一直以“文本”格式将值提供给NULL
,但是我应该在什么条件下切换到“二进制”?
到目前为止,我已经能够摆脱一些非常简单的查询:
$1::text[]
...
PQexecPrepared()
到目前为止,这可行,但是如果我想拥有
const char *query = "SELECT * FROM table WHERE col=$1::text";
const void *types = NULL; //Wish I knew what could be assigned to an Oid
PQprepare(conn, name, query, 1, static_cast<const Oid *>(types));
?我该如何表达传递给const int *lengths = NULL; //It doesn't seem like these vars are used for anything right now
const int *formats = NULL;
int result_format = 0;
//values is a const char * const * and is the return value of QScopedArrayPointer <char*>::data()
res = PQexecPrepared(conn, name, 1, values, lengths, formats, result_format);
的{{1}}?
我的项目是使用PostgreSQL 9.6的GNU C ++。
答案 0 :(得分:0)
如果像示例中那样发送了无类型的字符串参数,则它们将具有类型unknown
并尽可能转换为正确的类型。这与SQL语句中的字符串文字非常相似。
在SQL语句中不必强制转换为text
。如果您发现需要强制转换,我会很好奇col
的类型。
如果要以文本格式传递text[]
,只需使用其字符串表示形式,例如
{first element,two,three}
这也适用于整数和其他类型;只需使用值的文本表示形式即可。
您还可以使用paramTypes
的{{1}}参数来明确指定它的类型。可能的值在PQexecParams
的{{1}}列中,并且对于系统类型来说是恒定的。