最近刚学会在VB2008 中使用参数化SQL语句,于是马上用到代码中,却碰到查不到任何数据的情况,纠结了好几天,还是没有搞明白,差点吐血。不得已还是先在代码中使用字符串拼接的SQL语句。
包含参数化SQL语句的代码如下:
Dim cmSl As New OleDbCommand("select * from PENA where VSL_VOY=@vsl_voy and POD"+ _ "LIKE @pod ",dbCon)
Dim paPOD As New OleDbParameter("@pod", OleDbType.VarChar)
Dim paVSL_VOY As New OleDbParameter("@vsl_voy", OleDbType.VarChar)
paPOD.Value = IIf(Me.TextBoxPOD.Text.Length = 0, "%", Me.TextBoxPOD.Text.Trim.ToUpper)
paVSL_VOY.Value = Me.TextBoxVSL_VOY.Text.Trim.ToUpper
cmSl.Parameters.Add(paVSL_VOY)
cmSl.Parameters.Add(paPOD)
看起来没有任何错误,执行后就是没有任何结果!
然后把参数 paPOD 或者 paVSL_VOY去掉一个,即去掉
cmSl.Parameters.Add(paVSL_VOY) 或
cmSl.Parameters.Add(paPOD)
其中一个,SQL语句改成
select * from PENA where VSL_VOY=@vsl_voy 或者
select * from PENA where POD=@pod
也就是只让一个参数起作用,执行后都有结果!
把参考书翻来翻去也没有找到结果。
几天后上MSDN查看OleDbCommand.Parameters 集合的说明,终于找到了答案!原话是这样的:
The OLE DB .NET Provider does not support named parameters for passing parameters to an SQL Statement or a stored procedure called by an OleDbCommand when CommandType is set to Text. In this case, the question mark (?) placeholder must be used
也就是说,满足以下几个条件:
1、使用OLEDB.NET provider
2、由OledbCommand对象执行SQL语句或存储过程
3、执行的语句是文本类型
那么在参数化SQL语句中不能使用有名字的参数,而必须用?号代替参数。?号出现的顺序必须与添加到Parameters集合中的参数的顺序一致。我原来的代码完全符合这三个条件,怪不得要出问题。
几天的纠结总算化解。谢天谢地。