2012-03-03 42 views
0

我創建了插入字符串,其中包含C中的混合數據,並且不能插入行。
正如我所看到的問題可能是在我的語言環境中使用逗號作爲小數點分隔符的浮點數。PostgreSQL,使用libpq插入浮動

因此,在插入時,收到錯誤消息:

ERROR: INSERT has more expressions than target columns
LINE 1: ...0:11:37.097203 +0100', 'Book about solving issues', '', 'PCS', 0,000000)

代碼插入:

snprintf(sqlInsert, sizeof(sqlInsert), "INSERT INTO mytable (dtbl_id, kni, dtmp, iname, tagname, mea, klc) VALUES 
(%d, '%s', '%s', '%s', '%s', '%s', %f)", o, k, dt, es, tagname, meas)), IL.klc); 

如何解決這個情況,正確地插入雙精度數?

回答

1
rc = snprintf(sqlInsert, sizeof sqlInsert 
, "INSERT INTO mytable (dtbl_id, kni, dtmp, iname, tagname, mea, klc)" 
" VALUES    (%d,  '%s', '%s', '%s', '%s', '%s', %f);" 
         , o,  k, dt, es, tagname, meas, IL.klc); 

更新:如果有語言環境問題,setlocale()可能會幫助您在程序中設置本地。 LC_ALL = POSIX(或C)應始終存在。 (它很可能是該之一{%E%F%克}格式是不敏感的區域設置)

下面的程序演示)使用的setlocale的(:

#include <stdio.h> 
#include <locale.h> 

#pragma DONT define DEFAULT_LOCALE "POSIX" 
#define DEFAULT_LOCALE "nl_NL.utf8" 
/* LC_NUMERIC LC_ALL */ 

int main(int argc, char **argv) 
{ 
    double val; 
    char *old, *new; 

    val = 1024 * 1024; 
    val /= 10; 

    printf ("Original: Val=%f\n", val); 
    new = argv[1] ? argv[1] : DEFAULT_LOCALE ; 

    old = setlocale (LC_ALL, new); 

    printf("Old=%s, New=%s\n", old, new); 
    printf ("After change: Val=%f\n", val); 

    new = setlocale (LC_ALL, old); 

    printf("Old=%s, New=%s\n", new, old); 
    printf ("After restore: Val=%f\n", val); 
return 0; 
} 

輸出:

[email protected]:./a.out 
Original: Val=104857.600000 
Old=nl_NL.utf8, New=nl_NL.utf8 
After change: Val=104857,600000 
Old=nl_NL.utf8, New=nl_NL.utf8 
After restore: Val=104857,600000 
[email protected]: 

閱讀手冊後,我期望setlocale()返回舊的設置,但似乎並非如此。也許我無意中改變了一些全局設置: - [

更新:明確地將參數強制轉換爲* printf()函數總是好的。

#include <locale.h> 
(void) setlocale (LC_NUMERIC, "POSIX"); 

rc = snprintf(sqlInsert, sizeof sqlInsert 
, "INSERT INTO mytable (dtbl_id, kni, dtmp, iname, tagname, mea, klc)" 
" VALUES    (%d, '%s', '%s', '%s', '%s', '%s', %f);" 
        , (int) o,  k, dt, es, tagname, meas, (double) IL.klc); 
+0

我仍然無法得到這個工作。無論如何,當我們談論數字時,談論區域設置是很奇怪的。幾乎整個歐洲都使用逗號作爲小數分隔符,所以我現在很奇怪人們是如何做到這一點的。好的,我可以將雙打轉換爲字符串並將它們存儲爲字符串,但是我的數據庫中有字符串而不是數字,大多數情況下完全不可接受。 – 2012-03-03 16:29:23

+2

你是否也修復了'))? snprintf()之後緩衝區包含什麼?順便說一句,在我看來,該語言環境不適用於libc的東西。手冊頁顯示舊版本中存在不同的標準行爲。 – wildplasser 2012-03-03 16:31:55

+0

是的,我修好了。 IL.klc是從文件重新生成8位數字。如果我做printf(「%f \ n」,IL.klc);我得到了0,000000。同樣在緩衝區中。和MySql一樣,它和數字很好地結合在一起。如果我將數字寫回文件,無論小數點是什麼,它都會重新打包成8位。所以我認爲PQ會以二進制的方式存儲我的號碼。我仍然認爲我做錯了什麼,因爲存儲數字對於像PQ這樣龐大的系統是非常基本的操作,並且它不應該連接到本地。 – 2012-03-03 17:03:39