2015-05-06 63 views
0

我試圖發送一個新的用戶在我的C#程序到數據庫(MSAccess在這種情況下)。我創建的字符串如下...OLEDB SQL語法錯誤,我看不到

String StrCmd = String.Format("INSERT INTO tbl_Users (Username, Password, IsAdmin) VALUES ('{0}', '{1}', {2});", Username, passwordHash, AdminPower); 

這將創建一個SQL字符串,例如...

INSERT INTO tbl_Users (Username, Password, IsAdmin) 
VALUES ('TestUser', '1013638657', False); 

,如果我把它粘貼到MSACCESS查詢這工作得很好,但在代碼我不斷得到一個Syntax error in INSERT INTO statement.錯誤。

任何人都可以看到明顯的東西我失蹤?

其它信息:

UsernamepasswordHash是字符串,AdminPower是一個布爾值。

UsernamePassword是文本字段,IsAdmin是是/否字段。

關注代碼塊...

OleDbConnection MyConn = new OleDbConnection(Program.ConnStr); 
MyConn.Open(); 
String StrCmd = String.Format("INSERT INTO tbl_Users (Username, Password, IsAdmin) VALUES ('{0}', '{1}', {2});", Username, passwordHash, AdminPower); 
OleDbCommand Cmd = new OleDbCommand(StrCmd, MyConn); 
Cmd.ExecuteNonQuery(); 
MyConn.Close(); 
+0

String.Format()是**不是一種可接受的方式來將值替換爲sql查詢。它仍然瘋狂 - 容易受到SQL注入攻擊。 –

+0

謝謝,我已經考慮過了,但除了在將字符串傳遞給SQL之前清理字符串,坦率地說,如果管理員將坐在他們自己的筆記本電腦上的程序決定闖入數據庫,如果需要執行sql注入攻擊,他們可以打開坐在同一目錄中的數據庫文件。 ;) –

+0

這是沒有藉口不這樣做的權利...清潔字符串是不正確的。隔離他們是。始終使用參數化查詢。 –

回答

0

試試這個'{2}'

String StrCmd = String.Format("INSERT INTO tbl_Users (Username, Password, IsAdmin) VALUES ('{0}', '{1}', '{2}');", Username, passwordHash, AdminPower); 
+0

已經做了,沒有區別。 :(仍然得到相同的錯誤 –

+0

@StephenHammond,你可以試試這個:'String StrCmd = String.Format(「INSERT INTO tbl_Users(Username,Password,IsAdmin)VALUES('{0}','{1}',{ 2});「,用戶名,密碼哈希,0);' –

+0

感謝您的幫助,解決了它.. *在不同的平臺上, –

0

Facepalms我注意到的保留字我檢查是爲SQL-Sever的的名單。我發現一個用於MSAccess和「密碼」是Access中的保留字...我將其更改爲UserPassword,並且它可以正常工作...

grrr。