Tag: oracle

ODP.NET连接池参数

我正在尝试使用ODP.NET版本2.111.6.20为我的.NET应用程序配置连接池。 该数据库是Oracle 11.1。 我在我的.NET 2.0应用程序中使用以下连接字符串: Data Source=prod; User Id=FAKE_USER; Password=FAKE_PASS; Pooling=true; Min Pool Size=2; Max Pool Size=5; Connection Timeout=30;” 根据文档,连接池应初始化为2个连接,并根据需要增加最多5个连接。 它永远不会超过5个连接。 我所看到的是,连接每次增长2个,并且增长到10个连接。 我通过查询v $ session表来监视Oracle数据库中的连接,因此我知道连接来自源自我的应用程序的特定应用程序。 如果有人可以帮我确定在这个应用程序内的连接池中可能发生的事情,可能允许超过最大连接数,我会很感激。 样本C#代码 以下是调用数据库的代码示例: const string connectionString = “Data Source=prod; User Id=FAKE_USER; Password=FAKE_PASS; Pooling=true; Min Pool Size=5; Max Pool Size=5; Connection Timeout=30;”; using (OracleConnection connection = new OracleConnection(connectionString)) { connection.Open(); using […]

如何使用ExecuteScalar从插入的行中获取生成的id?

我知道在Oracle中我可以从插入的行中获取生成的id(或任何其他列)作为输出参数。 例如: insert into foo values(‘foo’,’bar’) returning id into :myOutputParameter 有没有办法做同样的事情,但使用ExecuteScalar而不是ExecuteNonQuery? 我不想使用输出参数或存储过程。 ps:我使用的是Oracle ,而不是sql server!

使用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设置吗? (我没有找到类似的东西,但我可能错过了……)

如何使用Entity Framework在oracle包中调用存储过程?

我在oracle 11g中有一个包如下: CREATE OR REPLACE PACKAGE “HRS.PKG_TRAINING_SP” as TYPE T_CURSOR IS REF CURSOR; procedure GETPERSONNELTRAINIGLIST( personnel_Id_in in string, base_date_in in string, is_current_in in number, lst OUT T_CURSOR ); end; 如何使用Entity Framework(代码优先)执行上述过程包( GETPERSONNELTRAINIGLIST )? 注意:我正在使用Entity Framwork 6.0(代码优先)并开发EF Provider for Oracle。 更新:我使用以下代码: var param1 = new OracleParameter(“personnel_Id_in”, OracleDbType.VarChar, “c5eb5589-8fee-47b6-85ad-261a0307cc16”, ParameterDirection.Input); var param2 = new OracleParameter(“base_date_in”, OracleDbType.VarChar, “1112”, […]

如何通过Entity框架自动为Oracle数据库生成标识?

我正在使用Oracle提供程序entity framework(beta),我遇到了一个问题。 我们的表有Id列,在StoreGeneratedPattern中设置为Identity。 我认为EF会自动执行“基础工作”,例如创建序列,并为我添加到表中的每条记录获取新标识。 但是当我运行代码来添加新记录时,例如: var comment = new Comment { ComplaintId = _currentComplaintId, Content = CommentContent.Text, CreatedBy = CurrentUser.UserID, CreatedDate = DateTime.Now }; context.Comments.AddObject(comment); context.SaveChanges(); 一个exception仍然会抛出,这是 {“ORA-00001:违反了唯一约束(ADMINMGR.CONSTRAINT_COMMENT)”} (CONSTRAINT_COMMENT是约束要求注释标识必须是唯一的。 我该如何解决这个问题? 非常感谢你!

Oracle托管驱动程序可以正确使用异步/等待吗?

我试图使用async / wait .NETfunction进行Oracle查询。 结果集相当大,大约需要5-10秒才能恢复。 Window_Loaded挂起了UI线程,本质上我想使用async / wait在后台执行查询,然后使用结果更新数据视图。 这是Oracle驱动程序问题还是代码错误? 例如,这是同步而不是异步完成的事情吗? 我正在使用Oracle可以从Oracle网站获得的最新Oracle.ManagedDataAccess 。 async Task AccessOracleAsync() { DataTable dt; using(OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings[“connStr”].ConnectionString)) using (OracleCommand cmd = new OracleCommand(@”SELECT * FROM myTbl”, conn)) { await conn.OpenAsync(); using (var reader = await cmd.ExecuteReaderAsync()) { dt = new DataTable(); dt.Load(reader); } } return dt; } private async […]

从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来解析名称。 那么管理的司机怎么办不起作用呢?

在C#中的单个Oracle命令中执行多个查询

我正在使用visual studio 2013和oracle数据库。我希望在单个oraclecommand中同时执行多个创建表查询是否可能? 我正在尝试跟随但不工作 OracleCommand cmd = new OracleCommand(); cmd.Connection = con; cmd.CommandText = “create table test(name varchar2(50) not null)”+”create table test2(name varchar2(50) not null)”; //+ “create table test3(name varchar2(50) not null)”+”create table test3(name varchar2(50) not null)”; cmd.CommandType = CommandType.Text; cmd.ExecuteNonQuery(); 在cmd.ExecuteNonQuery()时收到错误;

如何将unicode数据保存到oracle?

我试图在oracle数据库(10 g)中保存unicode数据(希腊语)。 我创建了一个简单的表: 替代文字http://sofzh.miximages.com/c%23/dvpqnk.png 我知道NVARCHAR2总是使用UTF-16编码,所以它必须适用于所有(人类)语言。 然后我试图在数据库中插入一个字符串。 我在代码中硬编码了字符串(“你好吗?”)。 然后我尝试从数据库中恢复并显示它。 class Program { static string connectionString = “”; static void Main (string[] args) { string textBefore = “Τι κάνεις;”; DeleteAll (); SaveToDatabase (textBefore); string textAfter = GetFromDatabase (); string beforeData = String.Format (“Before: {0}, ({1})”, textBefore, ToHex (textBefore)); string afterData = String.Format (“After: {0}, ({1})”, textAfter, ToHex […]