【问题标题】:passing arguments in oracle command using vb.net使用 vb.net 在 oracle 命令中传递参数
【发布时间】:2012-07-20 05:38:37
【问题描述】:

我在 vb.net.am 中使用 oracle 命令中的 select 语句编写代码。当我通过变量传递参数值时出现错误。

my code
------
chk1 = TextBox1.Text
d1 = Date.Parse(chk1)


--------
--------
try
   cn.Open()

        cmd = New OracleCommand("select PHONE from  reports.renewal_contact_t where run_date=to_date('+ d1 +','mm/dd/yyyy') and  EXP_DATE =to_date('07/21/2012','mm/dd/yyyy')", cn)

 ------------
 ada.Fill(ds, "reports.renewal_contact_t ")
end try


eror(in ada.fill statement)
 -----
ORA-01858: a non-numeric character was found where a numeric was expected 

【问题讨论】:

  • 那会是什么错误,请提供消息/堆栈跟踪。此外,从您的代码来看,您似乎没有为 d1 传递参数。

标签: oracle vb.net-2010 par


【解决方案1】:

您还没有设法将日期放入 SQL 查询中。您收到错误是因为 Oracle 无法将字符串 + d1 + 转换为 mm/dd/yyyy 形式的日期。我在 SQL*Plus 中得到完全相同的错误:

SQL> select to_date('+ d1 +', 'mm/dd/yyyy') from dual;
select to_date('+ d1 +', 'mm/dd/yyyy') from dual
               *
ERROR at line 1:
ORA-01858: a non-numeric character was found where a numeric was expected

有一种方法可以将日期连接到 SQL 字符串中以获得看起来可以工作的查询,但我不会向您展示。我不希望您养成这样做的习惯,因为这会使您的代码面临SQL injection(强制性XKCD comic link)的风险。

相反,我建议您使用绑定参数在 SQL 查询中设置日期。下面的示例代码使用名为p_run_date 的绑定参数将日期d1 传递到查询中,并将查询返回的电话名称写入Console.WriteLine

我在 C# 中编写了执行此操作的代码,对其进行了测试以验证它是否符合我的预期,然后尝试将其转换为 VB.NET。我还没有测试过这个 VB.NET 代码,所以在转换过程中可能会出现一两个(希望是轻微的)错误:

    Using OracleCommand cmd As New OracleCommand("select PHONE from reports.renewal_contact_t where run_date=:p_run_date and EXP_DATE =to_date('07/21/2012','mm/dd/yyyy')", cn)
        cmd.Parameters.Add(New OracleParameter() { Direction = ParameterDirection.Input, ParameterName = "p_run_date", OracleDbType = OracleDbType.Date, Value = d1 })
        Using OracleDataReader reader As cmd.ExecuteReader()
            While reader.Read()
                Console.WriteLine(reader.GetString(0))
            End While
        End Using
    End Using

【讨论】:

    【解决方案2】:

    vb 你可以试试:

    cmd = New OracleCommand(
        "select PHONE from  reports.renewal_contact_t where run_date=to_date('" & d1 & "','mm/dd/yyyy') and  EXP_DATE =to_date('07/21/2012','mm/dd/yyyy')", cn)
    

    这会将您的 d1 字符串连接到您的表达式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多