2016-10-01 15 views
1

我正在嘗試創建客戶端/服務器應用程序,但是我在服務器應用程序中遇到了一個問題。我希望服務器應用程序接受來自客戶端應用程序的包含多個變量的結構,然後在「INSERT INTO」psql語句中使用這些變量值。但是,正如標題所示,我對如何編寫代碼存在問題。下面,你會發現我的代碼的相關部分:如何在PQexecParams()中使用多個變量C

struct PersonInfo* buffer = (struct PersonInfo*)malloc(sizeof(struct 
PersonInfo)); 

recv(serv_sock_accept, buffer, sizeof(buffer), 0); 

//**Connection to database using PGconn (PGconn connection)** 

PGresult* res = PQexecParams(connection, 
       "INSERT INTO person(first_name, last_name, age) VALUES($1, $2, $3)", 
       3, 
       NULL, 
       buffer->person.fname, buffer->person.lname, buffer->age, 
       NULL, 
       NULL, 
       0); 

我不斷收到在哪裏,我宣佈我的變量值的線,這是導致我相信,我不能在此聲明多個值編譯錯誤PQexecParams()函數的一行。我覺得我的方式是錯誤的,所以請你們指點我正確的方向?是否可以在一個PQexecParams()語句中的Value行上聲明多個值?如果我將三個值分解爲他們自己的PQexecParams()語句,數據庫將創建三個單獨的條目,而不是一個。

非常感謝您爲我們提供的所有幫助!

回答

1

它可以完成,但不是以你想要的方式完成。 PostgreSQL文檔定義爲

PGresult *PQexecParams(PGconn *conn, 
         const char *command, 
         int nParams, 
         const Oid *paramTypes, 
         const char * const *paramValues, 
         const int *paramLengths, 
         const int *paramFormats, 
         int resultFormat); 

你不能只是添加額外的參數傳遞到函數調用,並期望您必須明白該功能的簽名;這不是C的工作原理。但是,如果我們看一下該簽名,我們看到的值作爲

const char * const *paramValues, 

如果我們假裝看不見const關鍵字過去了,這是可以通過在作爲char*陣列的char**秒。

嘗試按如下所示創建數組,然後將其傳遞到您嘗試傳入多個字段的位置。

char* values[3]; 
values[0] = buffer->person.fname; 
values[1] = buffer->person.lname; 
values[2] = buffer->person.age; 

注意 - 此代碼假設所有三個字段是字符*,這我知道是「年齡」一個相當大的假設。如果它是一個int,您將不得不計算如何將其轉換爲字符串,或者如何使用該函數提供的二進制模式。然而,我認爲這超出了這個問題的範圍。

+0

嗨,非常感謝您的意見,我非常感謝。我試着做你提到的,但是如果我將值聲明爲「char * values [3]」,我得到一個編譯器警告,聲明「從不兼容的指針類型值中傳遞'PQexecParams'的參數5」。但是,如果我將值聲明爲「const char * values [3]」,則不會收到編譯器警告,並且編譯得很好。但是當我從客戶端應用程序調用服務器時,psql語句不會執行。有任何想法嗎? –

+0

什麼是整個錯誤行,通常是不兼容的指針錯誤告訴你它期望什麼,它得到了什麼 –

+0

「note:expected'const char * const *'但參數的類型是'char **'extern PGresult * PQexecParams(PGconn *康恩) –

相關問題