我在Visual Basic中工作并使用OleDb访问Excel电子表格。我将工作表中的数据导入到我的DataGridView中,并且工作正常,但现在我正在进行过滤。在大多数情况下它工作得很好,但我尝试使用参数(" @ p1"依此类推),而且我遇到了一个非常奇怪的问题。
我可以拥有以下内容(不包括之前,之间和之后的一堆不相关的内容)
query = query & "Project" & " LIKE @Gah1"
...
MyCommand.SelectCommand.Parameters.AddWithValue("@Gah1", "%House%")
它给了我正在寻找的结果。但我似乎无法获得列本身名称的参数,例如
query = query & "@Gah1" & " LIKE @Gah2"
...
MyCommand.SelectCommand.Parameters.AddWithValue("@Gah1", "Project")
MyCommand.SelectCommand.Parameters.AddWithValue("@Gah2", "%House%")
不起作用(我已尝试将Project封装在不同的括号中,并以不同的方式填充,无法使其工作)。我发现了很多关于使用参数的例子,但没有使用它们来给出列名。
我猜测参数会改变字符串的表示方式,因为您不需要使用' '围绕字符串文字。 是不是可以在参数中给出列名?如果可以,我需要做什么?
好吧,它不让我发表评论,所以这里
a)哎呀,不,我猜不是 b)我最终在测试查询中发送的字符串查询是
"select * from [Bid Summary$] where @Gah1 LIKE @Gah2"
如果绝对需要,我可以发布程序,但这不是问题,因为如果我用Project或[Project]替换@ Gah1,整个过程完全正常,所以我只是展示了我改变的行。 我是参数化查询的新手,你能解释一下如何避免使用它的查询字符串吗?如果有更好的方式来做我正在做的事情,我很乐意使用它=) 并感谢您的回复和编辑
答案 0 :(得分:0)
我使用字符串方法和参数的组合,如下所示:
//replace field name in a query template
query = String.Format("select * from [Bid Summary$] where {0} LIKE ?", "@Gah1");
//set value (name is in OleDb parameter ignored, so it could be null)
MyCommand.SelectCommand.Parameters.AddWithValue(null, "%House%");
注意:有可能注入sql,所以请确保字段名称的来源(不是来自用户输入)。