[英]Inserting integer array with postgresql in C (libpq)
我正在嘗試將整數數組發布到我的postgresql數據庫中。 我知道我可以將所有內容格式化為字符串,然后將該字符串作為一個SQL命令發送。 但是,我相信PQexecParams函數也應該帶來一些幫助。 但是,我有點迷失了如何使用它。
//we need to convert the number into network byte order
int val1 = 131;
int val2 = 2342;
int val3[5] = { 0, 7, 15, 31, 63 };
//set the values to use
const char *values[3] = { (char *) &val1, (char *) &val2, (char *) val3 };
//calculate the lengths of each of the values
int lengths[3] = { sizeof(val1), sizeof(val2), sizeof(val3) * 5 };
//state which parameters are binary
int binary[3] = { 1, 1, 1 };
PGresult *res = PQexecParams(conn, "INSERT INTO family VALUES($1::int4, $2::int4, $3::INTEGER[])", 3, //number of parameters
NULL, //ignore the Oid field
values, //values to substitute $1 and $2
lengths, //the lengths, in bytes, of each of the parameter values
binary, //whether the values are binary or not
0); //we want the result in text format
是的,這是從某些教程中復制的。 但是,這返回:
ERROR: invalid array flags
使用常規方法確實可以:
PQexec(conn, "INSERT INTO family VALUES (2432, 31, '{0,1,2,3,4,5}')");
可以很好地插入數據,我也可以讀出數據。
任何幫助將不勝感激! :)
libpq
的PQexecParams
可以接受文本或二進制形式的值。
對於文本值,必須將整數sprintf
放入放置在char**
values數組中的緩沖區中。 通常是這樣完成的。 您可以將文本格式與查詢參數一起使用,沒有特殊的原因可以自己回退將參數插值到SQL字符串中。
如果要使用二進制模式傳輸,則必須確保整數是目標字段的正確大小,網絡字節順序,並且已指定OID類型。 為此使用htonl
(對於uint32_t
)或htons
(對於uint16_t
)。 丟棄簽名是很好的,因為您只是在對字節重新排序。
所以:
htonl
,不要釀造自己的字節順序轉換 values
數組構造錯誤。 您正在將char**
放入char*
數組中,並丟棄錯誤的類型。 您需要&val1[0]
或(在大多數/所有實際C實現中等效,但在規格上在技術上並不相同)只是val1
,而不是(char*)&val1
integer[]
的在線格式與C的int32_t[]
。 您必須傳遞OID INT4ARRAYOID
類型(請參閱include/catalog/pg_type.h
或select oid from pg_type where typname = '_int4'
include/catalog/pg_type.h
select oid from pg_type where typname = '_int4'
數組的內部類型名稱在其基本類型前面是_
),並且必須構造一個PostgreSQL數組值與兼容typreceive
在功能pg_type
的那種類型(這是array_recv
)如果你打算以二進制方式發送。 特別是, 二進制格式的數組具有header 。 您不能只忽略標題。 換句話說,該代碼以多種令人興奮的方式被破壞,並且可能無法按編寫的方式工作。
實際上, 以二進制模式發送整數幾乎沒有任何好處 。 實際上,以文本模式發送通常更快,因為它通常在線路上更緊湊(較小的值)。 如果要使用二進制模式,則需要了解C如何表示整數,網絡與主機字節順序的工作方式等。
尤其是在處理數組時,文本格式更容易。
通過為文本數組和二進制數組提供良好的數組構造/解構函數, libpq
可以使此操作比現在容易得多。 補丁一如既往地受歡迎。 現在, 諸如libpqtypes
類的第三方庫在很大程度上扮演了這個角色。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.