【问题标题】:Getting ORA-01036: illegal variable name/number error on select query vb.net code获取 ORA-01036:选择查询 vb.net 代码时出现非法变量名称/编号错误
【发布时间】:2022-01-08 07:34:59
【问题描述】:

在 vb.net 上为 oracle 执行 select 语句时出现以下错误。我正在尝试将帐号作为参数传递给 select 语句。下面是SQL语句

    Dim strSearchSQL As String
    strSearchSQL = "SELECT A.ACCT_GRP_CD, A.AVG_METH_CD , B.AVG_METH_DSCR, A.ACCT_GRP_DSCR,  A.COST_POOL_CD, A.ABC_MULT_NUM, A.INTRM_METH_CD, A.RATE_POOL_RPT_CD FROM GL_ACCT_GRP_TB A, GL_AVG_METH_TB B WHERE A.AVG_METH_CD = B.AVG_METH_CD"

    If Not AccountGroup = "" Then
        strSearchSQL = strSearchSQL & " AND ACCT_GRP_CD LIKE '%{: AccountGroup}%' "
    End If
    If Not OrderBy = "" And Not OrderAs = "" Then
        strSearchSQL = strSearchSQL & " ORDER BY " & OrderBy & " " & OrderAs
    Else
        strSearchSQL = strSearchSQL & " ORDER BY ACCT_GRP_CD XYZ "
    End If

    Dim cmd As New OracleCommand
    cmd.CommandText = strSearchSQL
    cmd.CommandType = CommandType.Text
    cmd.Connection = Connection.GetConnection
    
    cmd.Parameters.Clear()
    Dim Param1 As OracleParameter = New OracleParameter("AccountGroup", OracleType.Char, 500)
    Param1.Direction = ParameterDirection.Input
    Param1.Value = AccountGroup.Trim
    cmd.Parameters.Add(Param1)

下面是我遇到的错误

错误:ORA-01036:非法变量名/编号

请帮我确定我到底在哪里犯了错误

【问题讨论】:

  • 看起来参数(AccountGroup)在您的代码中是可选的,但添加它是强制性的

标签: oracle vb.net select oraclecommand


【解决方案1】:

如果 SQL 中存在 AccountGroup 参数,您只想添加它:

cmd.Parameters.Clear()
If Not AccountGroup = "" Then
  Dim Param1 As OracleParameter = New OracleParameter("AccountGroup", OracleType.Char, 500)
  Param1.Direction = ParameterDirection.Input
  Param1.Value = AccountGroup.Trim
  cmd.Parameters.Add(Param1)
End If

【讨论】:

  • 非常感谢,它现在对我有用。同样,我也厌倦了更改 OrderBy 和 OrderAs,但出现“ora-00936 缺失表达式”之类的错误。你能帮我解决这个问题吗?
  • 以下是更改: If Not OrderBy = "" And Not OrderAs = "" Then strSearchSQL = strSearchSQL & " ORDER BY {:OrderBy} {:OrderAs} " Else strSearchSQL = strSearchSQL & " ORDER BY ACCT_GRP_CD ASC " 如果结束
  • If Not OrderBy = "" And Not OrderAs = "" Then Dim Param2 As OracleParameter = New OracleParameter("OrderBy", OracleType.VarChar) Param2.Direction = ParameterDirection.Input Param2.Value = OrderBy cmd .Parameters.Add(Param2) Dim Param3 As OracleParameter = New OracleParameter("OrderAs", OracleType.VarChar) Param3.Direction = ParameterDirection.Input Param3.Value = OrderAs cmd.Parameters.Add(Param3) End If
  • ORDER BY {:OrderBy} {:OrderAs} 的语法肯定是错误的!
【解决方案2】:

试试这样:

Dim strSearchSQL As String

Dim cmd As New OracleCommand
cmd.CommandType = CommandType.Text
cmd.Connection = Connection.GetConnection

strSearchSQL = "SELECT A.ACCT_GRP_CD, A.AVG_METH_CD , B.AVG_METH_DSCR, A.ACCT_GRP_DSCR,  A.COST_POOL_CD, A.ABC_MULT_NUM, A.INTRM_METH_CD, A.RATE_POOL_RPT_CD "
strSearchSQL = strSearchSQL & " FROM GL_ACCT_GRP_TB A"
strSearchSQL = strSearchSQL & " JOIN GL_AVG_METH_TB B ON A.AVG_METH_CD = B.AVG_METH_CD " ' -> Modern join syntax

If Not AccountGroup = "" Then
    strSearchSQL = strSearchSQL & " WHERE ACCT_GRP_CD LIKE :AccountGroup "
    Dim Param1 As OracleParameter = New OracleParameter("AccountGroup", OracleType.VarChar, 500)
    Param1.Direction = ParameterDirection.Input 
    ' ParameterDirection.Input and OracleType.VarChar are default, you could skip them
    Param1.Value = "%{" & AccountGroup.Trim & "}%"
    cmd.Parameters.Add(Param1)    
End If

If Not OrderBy = "" And Not OrderAs = "" Then
    strSearchSQL = strSearchSQL & " ORDER BY " & OrderBy & " " & OrderAs
Else
    strSearchSQL = strSearchSQL & " ORDER BY ACCT_GRP_CD XYZ "
End If

cmd.CommandText = strSearchSQL

【讨论】:

  • @MT0 :声明以下语句的正确方法是什么。我遇到了问题,strSearchSQL = strSearchSQL & " AND ACCT_GRP_CD LIKE '%{: AccountGroup}%' " 似乎 LIKE 在这里没有正确执行。请建议在这里传递参数的正确方法。
  • 感谢您的宝贵时间。此代码有效,但我在 LIKE 语句中遇到问题。似乎它没有按应有的方式工作。它不接受 % 匹配。请建议我们是否可以修改任何不同的方式,以便 LIKE 关键字与带参数的 % 符号一起使用。
  • “不工作”是什么意思?你的代码和我的不一样。顺便说一句,大括号{} 的用途是什么?您真的在寻找some text{AccountGroup}some text(带大括号)吗?
  • 我在这里尝试通过传递帐户组的任何部分来获取所有记录。 'LIKE' 语句的工作方式。如果我将代码更改为ACCT_GRP_CD LIKE :AccountGroup ,那么我将获得与该特定帐户组关联的记录。例如:如果帐户组是“USAMD2022”。我希望如果我将值作为 MD 传递,那么这个或任何具有“MD”的帐户组都应该检索。但是对于ACCT_GRP_CD LIKE :AccountGroup ,我必须通过完整的帐户组才能获得“USAMD2022”。请建议如何解决这个问题。
  • 那就是Param1.Value = "%" & AccountGroup.Trim & "%"
猜你喜欢
  • 1970-01-01
  • 2013-01-06
  • 2011-10-05
  • 1970-01-01
  • 2020-07-29
  • 2016-04-03
  • 1970-01-01
  • 2018-10-16
  • 2015-03-11
相关资源
最近更新 更多