2012-11-22 90 views
0

我想通過與C#(而不是asp.net)通過Npqsql使用PostgreSQL,我創建了一個名爲GenData與SQL的表;PostgreSQL與C異常#

CREATE TABLE gendata 
(
    empname text NOT NULL, 
    pyrll text NOT NULL, 
    contracno text, 
    expird date, 
    dtbrth date, 
    plbrth text, 
    cid text, 
    passport text, 
    jndt date, 
    postn text, 
    dept text, 
    hmtwn text, 
    familymen numeric, 
    contno text, 
    CONSTRAINT gendata_pkey PRIMARY KEY (pyrll) 
) 

我試圖插入到表用下面的代碼:

String sql = String.Format("INSERT INTO GenData VALUES ({0},{1},{2},'{3}',{4},{5},{6},{7},{8},{9},{10},{11},{12},{13});" 
        ,textBox1.Text 
        ,textBox2.Text 
        ,textBox3.Text 
        ,textBox4.Text 
        ,textBox5.Text 
        ,textBox6.Text 
        ,textBox7.Text 
        ,textBox8.Text 
        ,textBox9.Text 
        ,textBox10.Text 
        ,textBox11.Text 
        ,textBox12.Text 
        ,textBox13.Text 
        ,textBox14.Text); 

但我總是得到這樣一個例外: enter image description here

+2

你爲什麼只引用第四欄?我想你應該引用你的所有列,除了數字。 – martin

+2

在進一步深入研究之前,您應該停下來仔細閱讀SQL注入攻擊。您不應該使用原始用戶輸入並將其直接提供給SQL語句,而應該使用參數化查詢。 –

+0

我知道SQL注入和參數化語句,我只是爲了測試目的而做的。 – Ahmed

回答

3

由於沒有使用SQL參數,而是直接將值嵌入到字符串中(這被認爲是非常糟糕的做法),則應遵循SQL語法。在你的特定情況下,你應該把所有的字符串參數包含到'中。

更好的方法是使用SQLParameter類來允許.NET對輸入數據執行所有必要的轉換,轉義數據以避免sql注入等等。我對Npgsql並不十分熟悉,但我幾乎可以肯定它遵循與其他.NET數據庫提供者相同的準則,所以您應該能夠以相同的方式使用SQLParameter類。

+0

它被稱爲NpgsqlParameter –