我有一個Access數據庫與C#和我做在SQL查詢aftere where子句,但我收到以下錯誤串聯在C#中使用SQL查詢的Access數據庫
「語法錯誤(缺少操作員)的串聯查詢表達式」
我的代碼如下
cmd.CommandText = "Select * from TEMP1 WHERE EMAIL=" + GlobalData.Email;
請告訴我是什麼原因造成的錯誤,什麼正確的語法是串聯。
我有一個Access數據庫與C#和我做在SQL查詢aftere where子句,但我收到以下錯誤串聯在C#中使用SQL查詢的Access數據庫
「語法錯誤(缺少操作員)的串聯查詢表達式」
我的代碼如下
cmd.CommandText = "Select * from TEMP1 WHERE EMAIL=" + GlobalData.Email;
請告訴我是什麼原因造成的錯誤,什麼正確的語法是串聯。
你最好使用的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]'
我認爲你的問題缺少引號。試試這個:
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));
嘗試類似下面
cmd.CommandText = "Select * from TEMP1 WHERE EMAIL='" + GlobalData.Email + "'";
這是開放給SQL注入。你至少應該提到這一點。 – 2011-12-31 13:32:05
我不知道有關的錯誤,但你應該嘗試一下這樣的
cmd.CommandText = string.Format("SELECT * FROM TEMP1 WHERE EMAIL='{0}'", GlobalData.Email);
這樣,你就不需要混淆醜陋的concatination,這需要大量的內存使用。
如果數據來自用戶輸入(很有可能),那麼SQL注入的查詢就會打開。 – Guffa 2011-12-31 13:35:27
內存使用情況曾經是真實的(在.Net 2.0和更早版本中),但現在,由於編譯器優化,醜陋的混亂是最有效的串聯方法(http://www.codeproject.com/Articles/303158/String -Concatenation-vs-Memory-Allocation-in-Cshar) – 2011-12-31 13:37:16
實際上,Francois B.給了你一個比我更好的例子,使用SqlParameters要好得多。 – IamStalker 2011-12-31 13:39:18
請嘗試使用Parameterised queries代替。出於安全性以及可讀性的原因,使用SQL查詢通常是常見的。
您不必字符串文字周圍的單引號,這樣你的查詢會落得像:
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;
你可以刪除第一個嗎?第二個更安全。 – 2011-12-31 13:34:50