簡體   English   中英

在C中使用Postgresql插入整數數組(libpq)

[英]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}')");

可以很好地插入數據,我也可以讀出數據。

任何幫助將不勝感激! :)

libpqPQexecParams可以接受文本或二進制形式的值。

對於文本值,必須將整數sprintf放入放置在char** values數組中的緩沖區中。 通常是這樣完成的。 您可以將文本格式與查詢參數一起使用,沒有特殊的原因可以自己回退將參數插值到SQL字符串中。

如果要使用二進制模式傳輸,則必須確保整數是目標字段的正確大小,網絡字節順序,並且已指定OID類型。 為此使用htonl (對於uint32_t )或htons (對於uint16_t )。 丟棄簽名是很好的,因為您只是在對字節重新排序。

所以:

  • 如果您打算使用二進制傳輸, 則不能忽略OID字段
  • 使用htonl ,不要釀造自己的字節順序轉換
  • 您的values數組構造錯誤。 您正在將char**放入char*數組中,並丟棄錯誤的類型。 您需要&val1[0]或(在大多數/所有實際C實現中等效,但在規格上在技術上並不相同)只是val1 ,而不是(char*)&val1
  • 您不能假定integer[]的在線格式與C的int32_t[] 必須傳遞OID INT4ARRAYOID類型(請參閱include/catalog/pg_type.hselect 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM