oracle如何从.net传递null

时间:2015-08-31 19:38:26

标签: c# sql .net oracle null

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

我所做的是:

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

然而,我收到the number of parameters or the type is not correct错误,因为您知道我们无法从.net库中看到实际查询

这个数字是绝对正确的,但是在我调试问题的方式中,我想问你是否正确传递空值

感谢

更新

一些代码

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#插入为double 对于所有DateDatetime,我会像这样插入它们:

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

我错了吗?

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

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());
    }
  }
}

修改

为了清楚起见并作为我的初始评论的后续内容,上述内容旨在表明如果指示了类型,则可以在没有特定值的情况下添加参数。示例中的结果参数值确实为null,而不是DBNull,但为null。

答案 2 :(得分:0)

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

  

参数数量或类型不正确

对我很清楚。如果您可以计算参数并确保它们按顺序列出(除非您在oracle命令中指定“按名称绑定”) - 这是第一步。第二步是了解oracle日期。如果您的程序有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没有问题。