Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将布尔参数传递给Oracle过程C#_C#_.net_Oracle_Stored Procedures_Ado.net - Fatal编程技术网

如何将布尔参数传递给Oracle过程C#

如何将布尔参数传递给Oracle过程C#,c#,.net,oracle,stored-procedures,ado.net,C#,.net,Oracle,Stored Procedures,Ado.net,我在Oracle中将布尔参数传递给我的过程时遇到问题。我犯了一个错误 ORA-06550: line 1, column 7: PLS-00306: wrong number or types of arguments in call to 'LOG_ENTRY' ORA-06550: line 1, column 7: PL/SQL: Statement ignored" Oracle中的过程: log_entry(p_rqserial in integer, p

我在Oracle中将布尔参数传递给我的过程时遇到问题。我犯了一个错误

ORA-06550: line 1, column 7:
  PLS-00306: wrong number or types of arguments in call to 'LOG_ENTRY'
ORA-06550: line 1, column 7:
  PL/SQL: Statement ignored"
Oracle中的过程:

log_entry(p_rqserial in integer,
          p_orig in varchar,
          p_type in char,
          p_objname in varchar,
          p_info in varchar,
          p_text in varchar, p_with_commit boolean)
这是我的代码:

    cmd = new Oracle.DataAccess.Client.OracleCommand("Vbank_pkg.vb_log_entry", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("p_rqserial", OracleDbType.Int32).Value = Log_Serial;
    cmd.Parameters.Add("p_orig", OracleDbType.Varchar2).Value = "\'" + p_orig + "\'";
    cmd.Parameters.Add("p_type", OracleDbType.Char).Value = "\'" + p_type + "\'";
    cmd.Parameters.Add("p_objname", OracleDbType.Varchar2).Value = "\'" + p_objname + "\'";
    cmd.Parameters.Add("p_info", OracleDbType.Varchar2).Value = "\'" + p_info + "\'";
    cmd.Parameters.Add("p_text", OracleDbType.Varchar2).Value = "\'" + p_text + "\'";
    cmd.Parameters.Add("p_with_commit", OracleDbType.Char).Value =true;
    cmd.ExecuteNonQuery();//Here error

有人知道怎么做吗?因为我找不到任何解决方案,许多人说将bool参数从C#传递到Oracle是不可能的,但我不相信这是没有办法的。

尝试使用
OracleCommand
BindByName
属性作为
true
强制数据提供者按名称绑定这些参数,而不仅仅是为索引绑定。您不需要将
作为参数传递。它以ado.net中的参数开头

ODP.NET不支持布尔数据类型。只需使用
1
0
作为
char
值来保存它

对于示例:

cmd = new Oracle.DataAccess.Client.OracleCommand("Vbank_pkg.vb_log_entry", con);

cmd.BindByName = true;
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("p_rqserial", OracleDbType.Int32).Value = Log_Serial;
cmd.Parameters.Add("p_orig", OracleDbType.Varchar2).Value = p_orig;
cmd.Parameters.Add("p_type", OracleDbType.Char).Value = p_type;
cmd.Parameters.Add("p_objname", OracleDbType.Varchar2).Value = p_objname;
cmd.Parameters.Add("p_info", OracleDbType.Varchar2).Value = p_info;
cmd.Parameters.Add("p_text", OracleDbType.Varchar2).Value = p_text;
cmd.Parameters.Add("p_with_commit", OracleDbType.Char).Value = "1";

cmd.ExecuteNonQuery();

以下面的过程为例

CREATE OR REPLACE PROCEDURE my_procedure
(
   condition NUMBER,...
在C#中,添加参数

cmd.Parameters.Add("@condition", OracleDbType.Char).Value = myObject.isCondition ? 1 : 0;

我已经准备好尝试这个了,但它不起作用。在我花了这么多时间之后,我要求更改Oracle中的函数,并将参数更改为整数0-false和1-true,速度要快得多:)但我仍然很高兴找到另一个解决方案。是的,我同意你的看法,但不幸的是ODP.NET不支持bool类型,因此,您必须使用1或0。当我尝试使用
OracleDbType.Char
时,我得到以下错误:
“ORA-06550:第1行,第7列:\nPLS-00306:调用'REGISTER'时参数的数目或类型错误\nORA-06550:第1行,第7列:\nPL/SQL:语句被忽略”System.Exception{Oracle.ManagedDataAccess.Client.oracleeption}
。我可以在自己的存储过程中避免这种情况,但如果不创建“包装器”进行翻译,我就无法在Oracle的内置存储过程中避免这种情况。奇怪的是,在我刚刚从12c1升级到当前版本12c2之前,ODP.NET一直对我有效。这个解决方案在Oracle.ManagedDataAccess v 12.1中似乎也不起作用。有人知道怎么做了吗?我看到,在提到gridtrak时,它曾经工作过,但现在不再工作了。删除引号,这是使用预处理语句和绑定参数的主要好处之一。难以置信,但确实如此:C#和Oracle存储过程之间不支持布尔参数。您需要改用Y/N或0/1类型的参数:-(