无法使用Access OleDB填充数据集

时间:2016-03-15 13:50:31

标签: vb.net visual-studio ms-access

现在已经尝试了几个小时了。我正在尝试使用Access Query填充数据集。查询在Access中正常工作但不填充数据集中的任何内容。该查询是视图的过滤器。 示例: -

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 &"*'")

我使用将查询设置为字符串并使用DataAdapter填充数据集。 但这并不奏效。我没有收到任何错误。数据不会出现在数据集中。

代码: -

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

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

我认为当查找表是视图时,这与访问查询有关。任何建议/解决方法将不胜感激。

干杯, 阿米尔

1 个答案:

答案 0 :(得分:0)

您应该使用参数化查询,而不是连接字符串。连接通常会产生错误的语法。有时这是由于缺少引号或其他简单的输入错误引起的,有时原因是在连接到查询文本的值中存在单引号。最后,虽然在MS-Access中更难以利用,但字符串连接会导致Sql Injection攻击。

尝试使用像这样的参数化查询

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")

请注意,如果您只有一个值,我也被迫向SelectCommand参数集添加9个参数。这是由OleDb提供程序引起的,该提供程序不支持命名参数,并且需要查询文本中存在的每个参数占位符(@pX)的值。无论如何,这种方法更安全,更清洁,更易于维护