2011-08-14 70 views
2

我正在做一個簡單的asp.net/c#應用程序和Oledb的一切工作得很好,直到現在。 類似的聲明只是不通過C#工作,它在Access中作爲SQL查詢。我也嘗試使用'a'而不是'@uname',仍然沒有任何回報。Oledb像聲明不工作在C#

OleDbDataAdapter dataAdapter = new OleDbDataAdapter(
    "SELECT accounts.ID, uname, firstname, lastname, description FROM accounts, profiles " + 
    "WHERE accounts.ID = profiles.ID AND uname like '*@uname*'", connection); 
dataAdapter.SelectCommand.Parameters.Add("@uname", OleDbType.VarChar).Value = tbxFilter.Text; 
+0

它應該是「%?%」嗎?另外,它看起來像你想做一個加入 –

+0

謝謝,它的工作,但爲什麼%不能在訪問和*做? –

+0

很高興聽到它的成效,請將其標記爲已接受。我認爲在閱讀 –

回答

4

好,從這裏我可以看到一個快速的方法來解決這個問題:

WHERE accounts.ID = profiles.ID AND uname like @uname 

,然後你的參數應該這樣定義:

dataAdapter.SelectCommand.Parameters.Add("@uname", OleDbType.VarChar).Value = "%" + tbxFilter.Text + "%" 

dataAdapter.SelectCommand.Parameters.Add("@uname", OleDbType.VarChar).Value = "*" + tbxFilter.Text + "*". 

一個側面說明:如果我是你,我不會直接包含tbxFilter.Text。相反,您應該使用以下代碼:

tbxFilter.Text.Replace("'", "''") 

因爲如果不加倍,參數中的符號會傷害您的SQL查詢。無論是或者你在你的文本控件的處理程序上執行這個安全檢查。

+1

@Vladmir上,您可以安全地從sql注入 –

+0

您不需要執行'tbxFilter.Replace(...)'。通過使用一個參數,這個轉義是爲你照顧的。 –

+0

我知道這一點,但我記得(我可能錯了),一個單一的「只是語法上毀掉了你的查詢。好吧,我明白你的觀點,肖恩。 – Vladimir

2

問題是你沒有使用正確的通配符。訪問可以使用*%,但大多數其他只使用%

+0

它適用於當我使用'%a%',但不'%@ uname%' –

+0

@DanielxFx我認爲你應該使用:'%?%'。當您使用參數並添加參數時,參數將放在問號 –

0

這樣的東西適用於我的數據庫。

dataAdapter 
    .SelectCommand 
    .Parameters 
    .Add(new OleDbParameter("uname", "?" + tbxFilter.Text + "?"));