2016-03-15 80 views
1

現在已經嘗試了幾個小時以上。我正在嘗試使用Access Query填充數據集。該查詢在Access中正常工作,但不填充數據集中的任何內容。該查詢是一個視圖的過濾器。 例子: -無法使用Access OleDB填充數據集

Select Column1 as MyList 
from (Select * from mytable 
where Column1 like "'*" & Textbox1.Text &"*'" 
or Column2 like "'*" & Textbox1.Text &"*'" 
or Column3 like "'*" & Textbox1.Text &"*'") 
union all 
Select Column2 
from (Select * from mytable 
where Column1 like "'*" & Textbox1.Text &"*'" 
or Column2 like "'*" & Textbox1.Text &"*'" 
or Column3 like "'*" & Textbox1.Text &"*'") 
union all 
Select Column3 
from (Select * from mytable 
where Column1 like "'*" & Textbox1.Text &"*'" 
or Column2 like "'*" & Textbox1.Text &"*'" 
or Column3 like "'*" & Textbox1.Text &"*'") 

我使用set作爲查詢字符串和使用的DataAdapter來填充數據集。 但這不起作用。我沒有得到任何錯誤。數據只是不顯示在數據集中。

代碼: -

Dim da as new OledbAdapter(sqlstring,myconn) 
Dim ds as New Dataset 

myconn.open() 
da.fill(ds,"TableName") 
myconn.close() 

我相信這事做訪問查詢時,查詢表是一個視圖。任何建議/解決方法,將不勝感激。

乾杯, 阿米爾

+0

爲什麼每行末尾都有雙引號?把它換成&「*'」&_ – Steve

+0

剛回來,並輸入它。對不起隊友。已修復 –

+0

_Dim cmd =「SELECT ....... WHERE Column1 Like'*」&textBox1.Text&「*'or Column2 Like'*」&textBox2.Text&「*'...... ...「_ – Steve

回答

0

而是連接字符串的,你應該使用參數化查詢。連接通常會產生不正確的語法。有時候這是由於缺少引號或其他簡單的鍵入錯誤引起的,有時候原因是連接到查詢文本的值中存在單引號。最後,儘管在MS-Access中更難以利用,字符串連接導致了Sql Injection攻擊。

嘗試使用參數化查詢一樣,我已經被迫9個參數添加到的SelectCommand參數集合此外,如果有真的只是一個值,這個

Dim cmd = "Select Column1 as MyList from (Select * from mytable " & _ 
    "where Column1 like @p1 or Column2 like @p2 or Column3 like @p3) " & _ 
"union all " & _ 
    "Select Column2 from (Select * from mytable " & _ 
    "where Column1 like @p4 or Column2 like @p5 or Column3 like @p6) " & _ 
"union all " & _ 
    "Select Column3 from (Select * from mytable " & _ 
    "where Column1 like @p7 or Column2 like @p8 or Column3 like @p9)" 

Dim da as new OledbAdapter(cmd,myconn) 
Dim text1 = "%" & textBox1.Text & "%" 
da.SelectCommand.Parameters.Add("@p1", OleDbType.VarWChar).Value = text1 
da.SelectCommand.Parameters.Add("@p2", OleDbType.VarWChar).Value = text1 
da.SelectCommand.Parameters.Add("@p3", OleDbType.VarWChar).Value = text1 
da.SelectCommand.Parameters.Add("@p4", OleDbType.VarWChar).Value = text1 
da.SelectCommand.Parameters.Add("@p5", OleDbType.VarWChar).Value = text1 
da.SelectCommand.Parameters.Add("@p6", OleDbType.VarWChar).Value = text1 
da.SelectCommand.Parameters.Add("@p7", OleDbType.VarWChar).Value = text1 
da.SelectCommand.Parameters.Add("@p8", OleDbType.VarWChar).Value = text1 
da.SelectCommand.Parameters.Add("@p9", OleDbType.VarWChar).Value = text1 
Dim ds as New Dataset 

myconn.open() 
da.fill(ds,"TableName") 

通知。這是由OleDb提供程序引起的,該提供程序不支持命名參數,並且需要查詢文本中存在的每個參數佔位符(@pX)的值。在任何情況下,這種方法都更安全,更清潔,更易於維護。

+0

謝謝史蒂夫。這工作。我注意到的唯一區別是在文本框字符串變量中使用了%,而在我的字符串查詢中使用了*。驚訝它仍然與通配符搜索%一起 –

+0

認爲hansup已經回答了。 –