如何将 ODAC 与 Visual Studio 2015 调用 Oracle DB(存储函数)一起使用

How To Use ODAC With Visual Studio 2015 Call Oracle DB (Stored-Function)

我的项目在 Visual Studio 的 Oracle DB 中发现了一个奇怪的问题。首先我打开我的 Toad 来检查 Oracle 功能,如下图所示:

当我将 3 个参数的值放入 SF_GET_COMP_SVAL 时,它正在工作,然后当我在我的项目中尝试如下时,它也工作得很好。

            using (OracleConnection con = new OracleConnection(ConfigurationManager.ConnectionStrings["OracleDbContext"].ToString()))
            {
                using (OracleCommand cmd = new OracleCommand())
                {
                    cmd.CommandText = "select PG_AIS.SF_GET_COMP_SVAL('3','2','1') from dual";
                    try
                    {
                        cmd.Connection = con;
                        con.Open();
                        cmd.ExecuteNonQuery();
                    }
                    catch
                    {

                    }
                }
            }

但是当我使用 Paramters 模式 时它无法工作,如下面的代码

cmd.CommandText="select PG_AIS.SF_GET_COMP_SVAL(:a1,:a2,:a3) from dual"; cmd.Parameters.Add("a2", "1");
cmd.Parameters.Add("a3", "2");
cmd.Parameters.Add("a1", "3");

为什么????

我浪费了半天时间,发现了我的 ODAC 问题,为什么不能在 Visual Studio 平台中插入带有参数的数据,因为 参数名称 ,如果事实上在我的 MySql 和 MSSql 中不需要遵循参数的顺序,但不幸的是在 Oracle 中它不能更改顺序,参数取决于索引顺序,因此您可以更改任何参数的名称

cmd.CommandText="select PG_AIS.SF_GET_COMP_SVAL(:a1,:a2,:a3) from dual";               
cmd.Parameters.Add("a1", "3");       
cmd.Parameters.Add("a2", "2");     
cmd.Parameters.Add("a3", "1");    
or  
cmd.CommandText="select PG_AIS.SF_GET_COMP_SVAL(:a1,:a2,:a3) from dual";    
cmd.Parameters.Add("xx", "3");    
cmd.Parameters.Add("a2", "2");    
cmd.Parameters.Add("a3", "1");    

参数 a1 或 xx 相同(取决于索引序列而不是参数名称)

两种代码可以得到相同的结果。
PS:希望Oracle Provider能尽快修改。

我找到了另一种方法来解决这个问题,请试试看

OracleCommand command = new OracleCommand(query, connection) 
    { CommandType = CommandType.Text, BindByName = true };

PS:http://www.codeproject.com/Articles/208176/Gotcha-sharp-Using-Named-Parameters-with-Oracl <-- 这可能是处理

的好方法