Tag: odp.net

使用ODP.NET按名称绑定查询参数

我目前正在使用Oracle的Microsoft ADO.NET提供程序( System.Data.OracleClient )。 我知道它肯定不是最好的Oracle提供商,它很快就会被弃用 ,我应该使用Oracle的ODP.NET。 我仍然使用MS提供程序的原因是因为ODP.NET按位置绑定参数 ,而不是按名称绑定 。 当您在查询中使用许多参数时,这实际上可以是PITA,因为您必须小心地以正确的顺序添加它们,这很容易导致错误。 在同一查询中多次使用相同参数时也很烦人,例如: SELECT A,B,C FROM FOO WHERE X = :PARAM_X OR :PARAM_X = 0 使用ODP.NET,我必须向OracleCommand添加两个参数,我认为这是愚蠢的…… ODP.NET的OracleCommand具有更改默认行为的属性: BindByName 。 设置为true时,参数按名称绑定,这就是我想要的。 不幸的是,这对我没有帮助,因为: 默认设置为false 我几乎从不明确地使用具体的ADO.NET类,我更喜欢使用ADO.NET 2.0抽象层( DbProviderFactory , DbConnection , DbCommand …)来减少与任何特定RDBMS的耦合。 所以我没有访问BindByName属性,除非我明确地转换为OracleCommand ,失去了所有的好处或抽象。 当使用ASP.NET SqlDataSource时,我自己不创建DbCommand,所以我没有机会将BindByName设置为true(我可以在Selecting事件中执行它,但实际上这样做真的很痛苦)每个SqlDataSource ……) 我该如何处理这个问题? 某处有BindByNameByDefault设置吗? (我没有找到类似的东西,但我可能错过了……)

从C#和ODP.NET调用包中的函数的代码

我试图用ODP.NET编写C#代码来调用包中的函数。 我收到以下两个错误: ORA-06550: line 1, column 7: PLS-00306: wrong number or types of arguments in call to INSERT_FUNC’ ORA-06550: line 1, column 7: PL/SQL: Statement ignored ORA-06550: line 1, column 7: PLS-00221: ‘INSERT_FUNC’ is not a procedure or is undefined ORA-06550: line 1, column 7: PL/SQL: Statement ignored 我的OracleCommand设置为: cmd.CommandText = “PKG_NAME.INSERT_FUNC”; cmd.CommandType = CommandType.StoredProcedure; […]

ODP.NET托管库确实解析别名,但32位库确实如此

我的盒子上安装了32位驱动程序(它们是由一些DBA安装和配置的) 我写了一个简单的脚本来测试驱动程序,几乎如下 using (DataTable table = new DataTable()) { using (OracleConnection connection = new OracleConnection()) { connection.ConnectionString = “Data Source=alias;User id=user;Password=password”; connection.Open(); using (OracleCommand command = connection.CreateCommand()) { command.CommandType = CommandType.Text; command.CommandText = “SELECT * FROM DUAL”; table.Load(command.ExecuteReader()); } } } 当我使用32位Oracle.DataAccess.dll将此应用程序编译为32位时,它会毫无障碍地执行。 但是,如果我使用Oracle.ManagedDataAccess.dll将应用程序编译为AnyCPU,则会收到ORA-12154(无法解析指定的连接标识符)错误。 如果我tnsping别名,它可以正常工作,并告诉我连接标识符与真实的数据库名称。 如果我然后更改连接字符串以使用真实数据库名称而不是别名,然后再次尝试使用托管库,它会毫不费力地执行。 我一直在阅读并发现这个答案,说托管驱动程序依赖于tnsnames.ora文件来解析别名,但我依赖于sqlnet.ora和ldap.ora中定义的LDAP服务器。 当我tnsping时,它说它使用sqlnet.ora来解析名称。 那么管理的司机怎么办不起作用呢?

ODP.NET Oracle.ManagedDataAccess导致ORA-12537网络会话结束文件

概观 我想用Orcale替换Oracle.DataAccess。 托管 DataAccess,但打开与后者的连接会引发ORA-12537网络会话文件结束exception。 exception消息/堆栈跟踪 {OracleInternal.Network.NetworkException(0x000030F9): ORA-12537 :在OracleInternal.TTC.OraBufReader.Read中的OracleInternal.TTC.OraBufReader.GetDataFromNetwork()中的OracleInternal.Network.ReaderStream.Read(OraBuf OB)上的Dateiende:Boolean bIgnoreData )OracleInternal.TTC.TTCProtocolNegotiation.ReadResponse()}中的OracleInternal.TTC.MarshallingEngine.UnmarshalUB1(Boolean bIgnoreData) 我正在尝试连接到Oracle 11g数据库,并且我的本地计算机上没有安装客户端。 工作测试应用程序(非托管) 使用Oracle.DataAccess 工作正常 。 using System; using Oracle.DataAccess.Client; namespace App.Odp.Unmanaged { internal class Program { private static void Main(string[] args) { //dummy connection string. using SID string connectionString = “User Id=***;password=***;Data Source=1.2.3.4:1521/sid01;”; try { using (var conn = new OracleConnection(connectionString)) { […]