2011-12-31 82 views
3

我有一個Access數據庫與C#和我做在SQL查詢aftere where子句,但我收到以下錯誤串聯在C#中使用SQL查詢的Access數據庫

「語法錯誤(缺少操作員)的串聯查詢表達式」

我的代碼如下

cmd.CommandText = "Select * from TEMP1 WHERE EMAIL=" + GlobalData.Email; 

請告訴我是什麼原因造成的錯誤,什麼正確的語法是串聯。

回答

10

你最好使用的SqlParameter(更安全):

SqlCommand cmd = new SqlCommand("SELECT * FROM Temp1 WHERE Email LIKE @email") 
cmd.Parameters.Add(new SqlParameter("email", GlobalData.Email)); 

要回答原來的問題:

使用直接CON連環,不字符串分隔符,查詢變成:

SELECT * FROM Temp1 WHERE Email LIKE [email protected] 

,而不是

SELECT * FROM Temp1 WHERE Email LIKE '[email protected]' 
+2

你可以刪除第一個嗎?第二個更安全。 – 2011-12-31 13:34:50

4

我認爲你的問題缺少引號。試試這個:

cmd.CommandText = "Select * from TEMP1 WHERE EMAIL='" + GlobalData.Email + "'"; 

但是,如果您不驗證電子郵件,該方法可能會導致SQL注入。雖然沒有什麼錯與上面的代碼,如果數據被驗證,我不喜歡使用SQL參數:

SqlCommand cmd = new SqlCommand("SELECT * FROM Temp1 WHERE Email = @Email") 
cmd.Parameters.Add(new SqlParameter("Email" , GlobalData.Email)); 
+0

是的,查詢中的字符串必須放在引號中。 – Rolice 2011-12-31 13:30:25

+2

如果數據來自用戶輸入(很有可能),那麼SQL注入的查詢就會打開。 – Guffa 2011-12-31 13:35:02

+0

@Guffa驗證有效郵件的正則表達式解決了這個問題。我會假定提交者在保存到數據庫之前驗證響應,因爲驗證後不能使用電子郵件注入等非常結構化的字符串。 – 2011-12-31 13:39:52

1

嘗試類似下面

cmd.CommandText = "Select * from TEMP1 WHERE EMAIL='" + GlobalData.Email + "'"; 
+3

這是開放給SQL注入。你至少應該提到這一點。 – 2011-12-31 13:32:05

1

我不知道有關的錯誤,但你應該嘗試一下這樣的

cmd.CommandText = string.Format("SELECT * FROM TEMP1 WHERE EMAIL='{0}'", GlobalData.Email); 

這樣,你就不需要混淆醜陋的concatination,這需要大量的內存使用。

+1

如果數據來自用戶輸入(很有可能),那麼SQL注入的查詢就會打開。 – Guffa 2011-12-31 13:35:27

+0

內存使用情況曾經是真實的(在.Net 2.0和更早版本中),但現在,由於編譯器優化,醜陋的混亂是最有效的串聯方法(http://www.codeproject.com/Articles/303158/String -Concatenation-vs-Memory-Allocation-in-Cshar) – 2011-12-31 13:37:16

+0

實際上,Francois B.給了你一個比我更好的例子,使用SqlParameters要好得多。 – IamStalker 2011-12-31 13:39:18

2

請嘗試使用Parameterised queries代替。出於安全性以及可讀性的原因,使用SQL查詢通常是常見的。

2

您不必字符串文字周圍的單引號,這樣你的查詢會落得像:

Select * from TEMP1 WHERE [email protected] 

這當然會導致一個語法錯誤。您需要撇號串繞:

cmd.CommandText = "Select * from TEMP1 WHERE EMAIL='" + Replace(GlobalData.Email, "'", "''") + "'"; 

然而,編碼字符串正確是不平凡的。 (以上方法適用於Access和Microsoft SQL Server中,但是其他的數據庫需要其他的方法。)你還是使用parametrised查詢:

cmd.CommandText = "Select * from TEMP1 WHERE [email protected]"; 

然後你一個參數添加到命令對象,例如:

cmp.Parameters.Add("@email", DbType.VarChar, 300).Value = GlobalData.Email;