Tag: odp.net

C#/ ODP.NET:大型IN子句解决方法

我们有一个C#组件,它处理将任意大小的元素列表附加到用于半任意SQL SELECT查询的IN子句中。 从本质上讲,这归结为接收如下内容: SELECT COUNT(*) FROM a WHERE b IN (…) …其中“…”是允许组件修改的查询的唯一部分。 目前该组件将插入一组以逗号分隔的命名绑定参数,然后将相应的IDbDataParameter对象附加到命令并执行; 组件知道它必须绑定的参数的类型。 这很有效,直到调用代码提供的参数集大于数据库愿意接受的参数集。 这里的目标是让这些大型集合通过ODP.NET处理针对Oracle 11gR2的查询。 由于以下方法被设定要求的人认为是不可接受的,因此这项任务有些复杂: 全球临时表 存储过程 任何需要CREATE TYPE东西都已被执行 解决方案不需要只执行一个查询。 我试图通过使用来自其他地方的代码将子句绑定为数组来完成此工作: IList values; //… OracleParameter parameter = new OracleParameter(); parameter.ParameterName = “parm”; parameter.DbType = DbType.String; parameter.Value = values.ToArray(); int[] sizes = new int[values.Count]; for (int index = 0; index < values.Count; index++) […]

ODP.NET / EF6 – WHERE子句中的CHAR数据类型

我正在使用EF6和ODP.NET开始一个项目,我在基于固定长度的CHAR列执行查找时遇到了麻烦。 即使此用户存在于数据库中,以下代码也不返回任何结果。 using (var context = new Entities()) { var search = “testuser”; var result = context.Users .Where(u => u.UserName == search) .FirstOrDefault(); } 我知道我可以通过填充搜索字符串或修剪数据库列来解决这个问题,但我正在寻找替代解决方案。 我注意到如果我使用OracleConnection / OracleCommand直接执行查询,那么它可以工作。 是否有一个属性或任何我可以添加到实体类以使ODP.NET将变量绑定为OracleDbType.Char? 基本上,我正在寻找一种从EF6重现以下行为的方法: var cmd = new OracleCommand(“SELECT * FROM users WHERE user_name = :p0”, conn); cmd.Parameters.Add(“:p0”, OracleDbType.Char).Value = “testuser”; 我还使用Devart的dotConnect Oracle驱动程序进行了测试。 使用该驱动程序,我可以通过添加以下代码行成功查找。 不过,我更喜欢在dotConnect上使用ODP.NET。 似乎ODP.NET忽略了这个属性,因为它在使用ODP.NET时没有任何效果。 ODP.NET会识别出与此类似的东西吗? modelBuilder.Entity() .Property(u […]

如何将表值参数从C#传递给Oracle存储过程

我有一个名为CREATE_CASE_EXL的Oracle存储过程: PROCEDURE CREATE_CASE_EXL(P_RICdata RICTab, P_sACTION_TYPE IN VARCHAR2); 其中RICTab是自定义类型: TYPE RICTab IS TABLE OF MMSRRicRec INDEX BY BINARY_INTEGER; TYPE MMSRRicRec IS RECORD ( RIC VARCHAR2(32), FID_NO NUMBER(8), REC_ID NUMBER(8), MMS_ACTION VARCHAR2(1) ); 我在PL / SQL中运行此代码来执行CREATE_CASE_EXL : DECLARE pTE_RICS RICTab BEGIN pTE_RICS(1).RIC := ‘RIC1’; pTE_RICS(1).FID_NO := NULL; pTE_RICS(1).REC_ID := 3; pTE_RICS(1).MMS_ACTION := ‘A’; pTE_RICS(1).RIC := ‘RIC2’; pTE_RICS(1).FID_NO […]

如何连接到远程Oracle数据库

我必须连接到远程Oracle DBMS到我的.NET C#Web服务 请求客户端Oracle安装? 为什么? 当你必须使用ODP.NET时 谢谢

数据库中的一些数据更改。 如何触发一些C#代码在这些更改上做一些工作?

假设我有一个带有数据库的应用程序A. 现在我想添加另一个应用程序B,它应该跟踪应用程序A的数据库更改。应用程序B应该在数据发生变化时进行一些计算。 两个应用程序之间没有直接通信。 两者都只能看到数据库。 基本问题是:数据库中的某些数据发生了变化。 如何触发一些C#代码在这些更改上做一些工作? 为了给出答案的一些刺激,我提到了一些我正在考虑的方法: 使应用程序B轮询感兴趣的表中的更改。 优点:简单的方法。 缺点:流量很大,特别是涉及到许多表时。 引入触发器,触发某些事件。 当他们开火时,他们应该在“事件表”中写入一些条目。 应用程序B只需要轮询该“事件表”。 优势:减少流量。 缺点:逻辑以触发器的forms放入数据库。 (这不是触发器“邪恶”的问题。这是一个设计问题,这使它成为一个劣势。) 摆脱轮询方法并使用SqlDependency类来获取更改通知。 优势:(也许?)流量少于轮询方式。 缺点:不是数据库独立的。 (我知道ODP.NET中的OracleDependency,但其他数据库呢?) 什么方法更有利? 也许我已经错过了上述方法中的一些主要(dis)优势? 也许还有其他一些我没有想到的方法? 编辑1:数据库独立性是…让我们称之为“销售人员”的一个因素。 我可以使用SqlDependency或OracleDependency。 对于DB2或其他数据库,我可以回退到轮询方法。 这只是一个成本和收益的问题,我想至少考虑一下,所以我可以讨论它。

过程参数中对Oracle UDT的绑定无效

我正在尝试调用一个过程,该过程采用自定义数据类型table of numbers作为参数之一。 以下是类型的定义: create type num_list as table of number; 以及程序的定义: create or replace procedure my_procedure (listofnumbers num_list, v_value char) is begin update my_table set my_column = v_value where my_row_id in (select column_value from table(listofnumbers)); end; 使用ODP.NET和C#,我将其声明如下: var row_ids = new int[] { 1, 2 }; using (var oracleConn = new Oracle.DataAccess.Client.OracleConnection(myConnectionString)) { oracleConn.Open(); […]

当DbDataAdapter.Update调用时,为什么我使用ODP.NET OracleDataAdapter获取OracleTruncateException而不使用System.Data.OracleClient的适配器?

我做了以下事情: protected int CreateComponent(DbConnection cnctn, string tableName) { int newId; DbCommand selectCmd = _provFactory.CreateCommand(); selectCmd.Connection = cnctn; selectCmd.CommandText = string.Format( “SELECT * FROM {0} WHERE ID = (SELECT MAX(ID) FROM {0})”, tableName); DbDataAdapter dataAdapter = _provFactory.CreateDataAdapter(); dataAdapter.SelectCommand = selectCmd; … // create Insert/Update/Delete commands with a builder for the data adapter … dataAdapter.Fill(_dataSet, tableName); newId […]

ODP.NET连接池:如何判断是否已使用连接

我正在修改Winforms应用程序以使用连接池,因此可以在后台线程中进行数据访问。 业务逻辑在PL / SQL中实现,并且为了利用业务逻辑,必须调用几个与安全相关的存储过程。 我需要的是一种方法来判断连接是否在没有往返数据库的情况下使用。 我不认为我可以在HashSet跟踪它们,因为我怀疑Equals甚至可以依赖ReferenceEquals 。 有任何想法吗? 编辑: 为了清楚起见,我计划使用ODP.NET的内置连接池机制。 如果我滚动自己的连接池,跟踪哪些连接是新的与使用的将是非常微不足道的。

使用odp.net连接到Oracle,使用C#连接OCI

我一直在阅读如何从我的C#win应用程序连接到我的oracle数据库,但我一直在“撞墙”。 我决定使用odp.net和OCI,这样客户端计算机不需要安装客户端,但我无法让它工作。 我有一个小的测试应用程序,我在下面显示的代码,在我的解决方案中,我从oracle OCI添加了以下dll:oci.dll,orannzsbb11.dll和oraociicus11.dll。 它们都与最终的.exe文件放在一起。 测试代码: private static string CONNECTION_STRING = “User Id=hr;Password=hr;Data Source=(DESCRIPTION=” + “(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))” + “(CONNECT_DATA=(SID=XE)));Connect Timeout=15;”; static void Main(string[] args) { try { using (var conn = new OracleConnection(CONNECTION_STRING)) { conn.Open(); Console.WriteLine(“Connection is: {0}”, conn.State.ToString()); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } 问题发生在using(…)语句中,程序停止工作,我没有得到任何响应。 为了让OCI工作,我需要做些什么?

使用uint数据类型的ODP .NET参数问题

从本机.NET oracle数据提供程序更新到Oracles ODP.NET后,我遇到了以下问题。 我有一个存储过程是包的一部分,它接受32个参数,所有IN只有一个,指定为OUT参数。 无论如何,这是我遇到的问题。 我有一个日期参数作为varchar2传入,然后3个其他参数也是varchar2。 至于其余部分,它们都是NUMBER类型。 在我的.NET代码中,传递给存储过程的所有值都是字符串或int,有4个例外。 我有4项UInt32类型的数据。 它们持有的值对于int来说太大了,因此使用了uint。 这是问题所在。 当我们使用本机.NET oracle数据提供程序时,参数构造函数包含OracleType.Number的数据类型,现在oracle参数构造函数具有OracleDbType.Int32和OracleDbType.Int64。 当设置为数据类型OracleType.Number的参数值时,uint数据类型没有问题,但现在使用新客户端,根据我使用的数据类型,我会得到不同的错误。 (顺便说一句,当我传入的值调用时,存储过程运行正常。这些exception都发生在Oracle Command对象实例的ExecuteNonQuery语句中。) 我使用以下组合更改了保存我的值以及参数的数据类型的数据类型。 以下是各自的结果。 .NET数据类型‘uint’ODP .NET参数数据类型‘OracleDbType.Int32’ * System.OverflowException:对于Int32,值太大或太小。 在Oracle.DataAccess的Oracle.DataAccess.Client.OracleParameter.PreBind_Int32()的System.Convert.ToInt32(对象值)的System.UInt32.System.IConvertible.ToInt32(IFormatProvider提供程序)的System.Convert.ToInt32(UInt32值)处ScoutLoaderService.EventLoader.Load()*中的Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()中的.Client.OracleParameter.PreBind(OracleConnection conn,IntPtr errCtx,Int32 arraySize) .NET数据类型‘uint’ODP .NET参数数据类型‘OracleDbType.Int64’Oracle.DataAccess.Client.OracleException ORA-06502:PL / SQL:数字或值错误:字符到数字转换错误ORA-06512:在第1行在Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode,OracleConnection conn,String procedure)中的Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode,OracleConnection conn,IntPtr opsErrCtx,OpoSqlValCtx pOpoSqlValCtx,Object src,String procedure,Boolean bCheck) ,在ScoutLoaderService.EventLoader.Load()*的Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery(),IntPtr opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,Object src,Boolean bCheck) .NET数据类型‘Int64’ODP .NET参数数据类型‘OracleDbType.Int64’Oracle.DataAccess.Client.OracleException ORA-06502:PL / SQL:数字或值错误:字符到数字转换错误ORA-06512:在第1行在Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode,OracleConnection conn,String procedure)中的Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 […]