2010-12-13 73 views
0

我想執行一個sql語句在vb.net到一個Access數據庫,我使用方括號[]逃避了保留字。這在我的程序中的所有SELECT聲明中都有效。vb.net轉義sql語句中的保留關鍵字

保留字是level

但下面的SQL語句失敗說

在INSERT的語法錯誤的語句。

如果我直接複製該語句,並在Access執行該正常工作

datalayer.getDataTable(String.Format("INSERT INTO users (username, password, [level]) VALUES ({0}, {1}, {2})", username, password, level)) 

如果我刪除[等級],並與另一列名替換該上述語句的工作。

謝謝。

回答

1

你沒有用引號括起你的值。試試這個:

datalayer.getDataTable(String.Format(
"INSERT INTO users (username, password, [level]) VALUES ('{0}', '{1}', '{2}')", 
username, password, level)) 

但是,正如Andrew所說,你應該真的使用參數。在訪問SQL (大衛W芬頓將很快來,並說它是「Jet」SQL)你必須使用位置參數。然後,您的發言是這樣的:

INSERT INTO users (username, password, [level]) VALUES (?, ?, ?) 

你需要用正確的價值觀創建OleDbParameter對象,並用文字一個OleDbCommand以上才能做你插入執行。

+0

我嘗試過引用值,但這仍然有相同的結果?謝謝。 – Elliott 2010-12-14 00:08:17

+0

@Elliott,編輯你的答案並向我們展示你在Access中執行的確切語句。無論是[水平]還是不起作用的那個,還有其他一些能夠起作用的那個。 – 2010-12-14 01:35:06

0

始終使用parameters。你在做什麼是非常危險的,並打開SQL injection

然後,您將不必擔心轉義您插入數據庫的值。

+0

嗨,因爲這個項目是爲大學生,我不必擔心安全問題,有沒有快速解決這個問題?謝謝 – Elliott 2010-12-14 00:04:18

+0

並非如此 - 通過使用參數可以提高安全性並消除轉義數據的需要。 – 2010-12-14 00:07:28

+0

我會擔心安全,但我很急於完成這個項目,但我想我會考慮它。謝謝:) – Elliott 2010-12-14 00:15:06