我的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;
我知道我使用的是已弃用的库,但它对我们来说很好
我的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
对于所有Date
和Datetime
,我会像这样插入它们:
cmd.Parameters.AddWithValue("as_date_time", DateTime.Now.ToString("dd/MMM/yyyy"));//'18/MAY/2015'
我错了吗?
答案 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日期。如果您的程序有date
或timestamp
参数,则无法使用
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客户端不同)使DBNull
或null
没有问题。