【问题标题】:oracle how to pass null from .netoracle如何从.net传递null
【发布时间】:2015-09-01 11:31:24
【问题描述】:

我的 oracle 函数中有一个参数,我想将 null 传递给它,

我所做的是:

cmd.Parameters.AddWithValue("al_acc_br", DBNull.Value);

但是,我收到了 the number of parameters or the type is not correct 的错误消息,如您所知,我们无法从 .net 库中看到实际查询

这个数字是绝对正确的,但是以我调试问题的方式我想问你我是否正确传递了 null

谢谢

更新

一些代码

using (OracleConnection cn = new OracleConnection(OracleConnString(oracleHost, oraclePort, oracleServiceName, oracleUsername, oraclePassword)))
            {
                OracleDataAdapter oda = new OracleDataAdapter();
                OracleCommand cmd = new OracleCommand();
                cmd.Connection = cn;
                cmd.CommandText = oracleSchema + "." + oracleFunction;
                cmd.CommandType = CommandType.StoredProcedure;
                fillParameters(cmd);
                oda.SelectCommand = cmd;

我知道我正在使用已弃用的库,但这对我们来说很好

更新 2

我的 oracle 函数中的参数有以下类型:

Varchar(8), Varchar(40), Numeric(4), Numeric(6), Varchar(35), Numeric(3), Date, Numeric(20,6), Datetime

而我所做的是:

对于所有varchar(x),我将它们作为字符串从 c# 插入 对于所有numeric(x),我将它们从 c# 插入为整数 对于所有numeric(x,y),我将它们从 c# 插入为双精度 对于所有DateDatetime,我将它们插入如下:

cmd.Parameters.AddWithValue("as_date_time", DateTime.Now.ToString("dd/MMM/yyyy"));//'18/MAY/2015'

请问我错了吗?

【问题讨论】:

  • 完整的命令是什么?以及如何在实际命令文本中定义参数
  • 请同时提供错误的完整堆栈跟踪。
  • 根据this answer DBNull.Value 应该完全没问题。让我相信@Habib 可能会对您的命令对象或过程本身有所了解。
  • @Habib 我添加了代码
  • @MarcoDinatsoli,proc 中的参数是如何定义的,您可以粘贴代码的特定部分吗?看起来像是一个小错字...,因为 DBNull.Value 应该适用于空值

标签: c# sql .net oracle null


【解决方案1】:

如果数据库列是日期,则不能存储字符串,也不需要关心任何 string.format。

替换 cmd.Parameters.AddWithValue("as_date_time", DateTime.Now.ToString("dd/MMM/yyyy"));

cmd.Parameters.AddWithValue("as_date_time", DateTime.Now));

对于空值: cmd.Parameters.AddWithValue("as_date_time", System.DBNull));

【讨论】:

    【解决方案2】:

    您需要小心使用 Oracle 日期。这个错误

    参数个数或类型不正确

    对我来说很清楚。如果您可以计算参数并确保它们按顺序列出(除非您在 oracle 命令上指定“按名称绑定”) - 这是第一步。第二步是了解oracle date。如果您的程序有任何datetimestamp 参数,这将不起作用

    cmd.Parameters.AddWithValue("as_date_time", DateTime.Now.ToString("dd/MMM/yyyy"));
    

    仅仅是因为 oracle 数据类型和 .net 数据类型不匹配。一般建议是永远不要将日期作为字符串传递。这样做你真的是在自取其辱。

    这是添加参数的通用语法

    OracleParameter date = new OracleParameter();
    date.OracleDbType = OracleDbType.Date; // or Timestamp
    date.Value = myDateValue; 
    orclCommand.Parameters.Add(date);
    

    现在,请记住,如果您的 myDateValue 可以为空 - 这没关系。 ODP.net(与 sql 客户端不同)采用 DBNullnull 没有问题。

    【讨论】:

      【解决方案3】:
      using System;
      using System.Collections.Generic;
      using System.Data.OracleClient;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApplication1
      {
        class Program
        {
          static void Main(string[] args)
          {
            var cmd = new OracleCommand();
            cmd.Parameters.Add("param1", OracleType.DateTime);
            var value = cmd.Parameters["param1"];
            Console.WriteLine(value.Value == null ? "null" : value.Value.ToString());
          }
        }
      }
      

      编辑

      为了清楚起见并作为我最初的 cmets 的后续行动,以上内容旨在显示可以添加参数而无需指定类型的特定值。示例中的结果参数值确实为null,不是DBNull,而是null。

      【讨论】:

      • 错误答案 - "null" 不是一个选项
      • @T.S.我想你的意思是null 不是一个选项。 OP 声明:我想将 null 传递给它,
      • 好吧。好的。 OracleParameter 的工作方式与 SqlParameter 不同。 var value = cmd.Parameters["param1"]; 将返回 OracleDate
      • @T.S.明白,但我遵循了 OP 的示例,其中cmd.Parametersnew OracleCommand() 构造。除此之外,我很好奇底层驱动程序是否会接受 null 并将其转换为 SQL NULL
      • ODP.NET,与 SqlClient 不同,在将其分配为值时,null 没有问题。但是(至少在输出参数上)当读取值时,它将具有 [oracle] 空值的 oracle 数据类型。当您在其上执行ToString 时,它将打印'null'。你需要做的是((OracleDate)p.value).IsNull
      猜你喜欢
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 2011-01-22
      • 2019-04-27
      • 2012-07-07
      • 2012-12-22
      相关资源
      最近更新 更多