2016-12-10 73 views
1

有人可以看看我的代碼,並可能指向我爲什麼它不允許我插入數據到我的Postgres數據庫?我正在爲我的收藏創​​建漫畫書數據庫。使用Npgsql和VB.net插入數據到Postgresql的問題

每次我點擊我的提交按鈕提交輸入的數據,調試器會拋出異常:

「類型的未處理的異常‘Npgsql.PostgresException’發生在Npgsql.dll」

恰好在執行myCommand.ExecuteNonQuery()函數。

我花了一天的時間試圖弄明白這一點,我是一個完整的小白。任何指導都會很棒!

Dim myConnection As NpgsqlConnection = New NpgsqlConnection() 
     Dim myCommand As NpgsqlCommand 
     Dim mySQLString As String 
     myConnection.ConnectionString = "Server=localhost;Port=5432;Database=ComicsDatabase;User Id=postgres;Password=xxxxxxxx;" 

     mySQLString = "INSERT INTO Comics (IssueName,IssueNumber,PublicationDate,Publisher,IsVariant) VALUES (" & comicName & "," & issueNumber & "," & publicationDate & "," & publisher & "," & isVariant & ");" 
     myCommand = New NpgsqlCommand(mySQLString, myConnection) 
     myConnection.Open() 
     myCommand.ExecuteNonQuery() 
     myConnection.Close() 

回答

0

當你像上面連接字符串來組成你的sql命令時,很容易陷入常見錯誤。例如,在你的代碼中,一個字符串值應該包含在單引號之間。

所以,假設IssueName是一個字符串類型字段,你應該表達值以這種方式

.... VALUES ('" & comicName & "'," & .... 

但這是一個補救措施比疾病更糟糕。首先,如果您的comicName變量包含單引號,則會出現另一個問題,其次,字符串連接是導致Sql注入的主要方式(非常危險的代碼漏洞)

將值傳遞給數據庫引擎(......這個世界上的任何數據庫引擎)是通過參數化查詢

你寫的查詢將參數佔位符,而不是直接值 (無字符串連接,無怪異&和單引號.... )

mySQLString = "INSERT INTO Comics 
    (IssueName,IssueNumber,PublicationDate,Publisher,IsVariant) 
    VALUES (:comicName,:issueNumber,:publicationDate,:publisher,:isVariant);" 

而且然後你使用參數傳遞值添加到命令參數採集

myCommand = New NpgsqlCommand(mySQLString, myConnection) 
    myCommand.Parameters.Add(":comicName", NpgsqlDbType.Varchar).Value = comicName 

當然,你需要添加所有的佔位符所需的其他參數,要記住最重要的是要使用正確的NpgsqlDbType爲您嘗試更新的特定列。

+1

謝謝你的解釋!我甚至沒有想到我會有特殊人物的漫畫! 進一步挖掘後,它看起來像'myConnection.Open()'可能是罪魁禍首。 調試器正在拋出一個內部異常: 無法立即完成非阻塞套接字操作。 我現在不在Google上看看我能不能找出這個問題了! 再次感謝您的幫助! – Eldridge

相關問題