Tag: odp.net

c#datatypes – > oracle数据类型

我喜欢在Oracle数据库中保存不同的c#数据类型(int,decimal,double,string,Guid,…)。 有没有人有一个表格显示要使用的oracle数据类型? 我找到了表格,显示了用于不同oracle数据类型的c#数据类型,但不是相反。

oracle odp.net SafeMapping转换,如果有时区的时间戳 – 如何获取偏移而不是区域名称

从c#开始,使用odp.net,我调用一个返回游标的oracle函数。 某些列的类型为“带时区的时间戳”(TSTZ)。 如果我直接使用OracleDataAdapter ,那些列将转换为System.DateTime,并且时区信息将丢失。 这是预期的行为,建议似乎是使用SafeMapping强制转换为字符串,如: dataAdapter.SafeMapping.Add(“column_name”, typeof(string)); 然后我确实将TSTZ作为一个字符串,但它使用的格式为DD-MON-YYYY HH:MI:SS.FF AM TZR如下: 23-NOV-12 08.10.12.057868000 PM ASIA/CALCUTTA 我想要它而不是偏移(例如格式为DD-MON-YYYY HH:MI:SS.FF AM TZH:TZD如: 23-NOV-12 08.10.12.057868000 PM +04:30 当我直接查询oracle(比如在Sql Developer中)时,我可以使用 Alter Session Set Nls_Timestamp_Tz_Format=’DD-MON-YYYY HH:MI:SS.FF AM TZH:TZM’ 获得我想要的格式。 使用odp.net我尝试在SetSessionInfo中设置格式: connection.Open(); OracleGlobalization glob = connection.GetSessionInfo(); glob.TimeStampTZFormat = “DD-MON-YYYY HH:MI:SS.FF AM TZH:TZM”; connection.SetSessionInfo(glob); 以及使用相同的连接执行alter session命令,但都没有任何效果。 我认为这是因为转换为字符串发生在稍后阶段,连接设置无效。 有没有其他方法可以让odp.net直接为我提供偏移量? 我无法更改oracle db函数,因此在方法中使用例如tz_offset不是一个选项。 如果这不可能,那么将时区字符串转换为偏移量的最佳方法是什么? 我正在考虑执行一个 select […]

如何使用带有ODP(Oracle.DataAccess)的>> prepared query <<更新CLOB字段中的数据?

我正在尝试执行准备好的SQL查询,该查询更新Oracle 10g数据库(10.2.0.1)中的CLOB字段。 如果我从SQL Developer内部执行以下查询并提供占位符的值,则没有问题。 但是,如果我通过OracleCommand (Oracle.DataAccess.dll,版本1.102.0.1(我认为),.NET Framework 3.5)执行它,我会收到以下错误消息。 请注意,我们不使用默认的oracle客户端,因为我们需要批量插入。 不幸的是,给定的ODP版本和.NET Framework版本是一项艰难的要求,我们可能不会改变它。 查询: UPDATE master_table SET description = :description, modification_notes = :modification_notes WHERE master_id = :master_id; 错误: ORA-00932:不一致的数据类型:预期 – 获得CLOB 进一步的信息: 参数分配如下: var param_description = new OracleParameter(“:description”, OracleDbType.Clob); param_description.Value = “Test”; 我尝试过以下的事情: 将to_clob()插入SQL查询 将Oracle.DataAccess.Types.OracleClob对象分配给参数。 我也找到了以下描述,但我真的希望能够保留准备好的查询。 如何使用C#在Oracle中插入CLOB字段 是否可以通过准备好的查询来完成此操作? 我附上了一个产生错误的完整示例。 DESCRIPTION和MODIFICATION_NOTES是数据库中CLOB类型的两列。 输入数据: 连接: OracleConnection到数据库 master_id:要过滤的主键 码: 免责声明:我手动输入以下示例,可能存在实际代码中没有的错误 var […]

Odp.Net – 取决于客户端和服务器

我对理论提出质疑。 我的应用程序使用Odp.Net。 我添加了Oracle.DataAccess.dll版本2.112.3.0作为参考文件。 我使用Odp.Net来查询数据库和注册表查询通知 。 在每台计算机上,我从http://www.oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html安装ODAC 11.2第5版(11.2.0.3.20)。 我想知道我的Odp.Net版本,Oracle客户端版本(可以安装在客户端计算机上)和Oracle Server版本之间存在哪些依赖关系。 问题是,在我注册查询通知后,我可以看到USER_CHANGE_NOTIFICATION_REGS表中的行。 但几秒钟后,此通知未注册并消失。 我读到这与版本问题有关,但我无法理解我必须做什么。 我的目标是在我的应用程序中使用相同的Odp.Net文件(Oracle.DataAccess.dll +一些额外的依赖项,如oci.dll等)。

使用ODP.NET与企业库DAAB连接Oracle

我们的应用程序使用Enterprise Library DAAB来支持oracle和sql数据库。 其中一个存储过程用于将图像上载到表格。 它是一个BLOB字段,参数设置为DbType.Binary。 这个function对SQL没有任何问题,但是当遇到Oracle时,我遇到了32K参数大小限制问题。 正如SO中所建议的那样,我将代码移到了ODP.NET,但我仍面临同样的问题。 我的App.config文件设置: 在我的应用程序代码中,我使用企业库来访问数据库 Database db = DatabaseFactory.CreateDatabase(); DbCommand cmd = db.GetStoredProcCommand(spName); cmd.CommandType = CommandType.StoredProcedure; db.AddInParameter(cmd, “DOCIMAGE”, DbType.Binary, GetByteArrayFromFile(filePath)); db.AddOutParameter(cmd, “return_value”, DbType.Int32, 128); int row = db.ExecuteNonQuery(cmd); 我的项目中引用了以下程序集: 现在,当我运行应用程序时,Ent Lib DAAP应该使用Oracle.DataAccess.Client,但它仍然通过System.Data.OracleClient连接到oracle db。 所以还有32K的限制。 为什么它没有使用Oracle数据提供程序,因为我已在App.config中明确提到过? 在一篇文章中,提到使用以下代码段作为解决方法, DbProviderFactory providerFactory = DbProviderFactories.GetFactory(“Oracle.DataAccess.Client”); Database db = GenericDatabase(connectionString, providerFactory); 这个看起来很有效。 但实例化的数据库是GenericDatabase而不是OracleDatabase,这可能就是为什么即使这个工作仍然在文件大小超过32K时抛出exception。 如何将ODP.NET与Enterprise Library一起用于32K大小限制问题? 决议 : […]

为什么这个oracle批量插入不起作用?

我正在尝试将一些数据批量插入到oracle db中。 我按照文档中的示例进行操作。 this.DataBaseAccess = new OracleConnection(connString); var dataAdapter = new OracleDataAdapter(); var insertCmd = DataBaseAccess.CreateCommand(); insertCmd.CommandType = CommandType.Text; insertCmd.BindByName = true; var names = new List(); foreach (DataTable table in product.Contracts.Tables) { foreach (DataRow row in table.Rows) { names.Add(row[“Contract”].ToString()); } const string InsertContracts = “merge into CONTRACT t ” + “using ” + “(select […]

从C#中的PL / SQL匿名块返回游标

我正在努力将现有的应用程序从SQL Server转换为Oracle,我遇到了障碍。 我正在尝试将匿名块作为动态SQL执行并返回结果集。 然而,我尝试过的任何东西似乎都无法返回任何值。 由于设计限制,存储过程已经完成。 我的查询定义为: DECLARE type id_array IS TABLE OF number; t_Ids id_array; BEGIN UPDATE CSM_RECORDS SET MIGRATION_STATE = 1, LAST_UPDATE = CURRENT_DATE WHERE OBJECT_UID IN (SELECT OBJECT_UID FROM CSM_RECORDS obj WHERE MIGRATION_STATE = 0 AND ROWNUM <= :BatchSize) AND (:BatchName IS NULL OR obj.BATCH_NAME = :BatchName) RETURNING OBJECT_UID BULK COLLECT INTO t_Ids; […]

C#2010,ODP.net,调用存储过程传递数组

我有一个PL / SQL存储过程,需要4个输入。 其中一个输入是关联数组(Oracle Type:VARCHAR2表(1)PLS_INTEGER索引)。 我想要一个C#程序,用适当的输入调用这个存储过程,包括关联数组。 我正在使用ODP.net 11.2与Visual C#2010 Express和Oracle 11gR2。 我找不到任何关于如何从C#传递数组到pl / sql过程的好例子。 有谁可以举个例子? 以下Oracle文档确切地告诉我错误的数字或参数类型。 我的C#代码: OracleCommand cmd = new OracleCommand(“begin sdg_test.sdg_test2(:1); end;”, conn); OracleParameter Param1 = cmd.Parameters.Add(“1”, OracleDbType.Varchar2); Param1.Direction = ParameterDirection.Input; Param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray; Param1.Value = new string[22] { “Y”, “Y”, “N”, “Y”, “N”, “Y”, “Y”, “Y”, “Y”, “Y”, “N”, “Y”, “N”, “Y”, […]

ODP.NET错误无法找到请求的.Net Framework数据提供程序

我正在尝试使用Oracle 11g Express和.NET 4.0框架开发ASP.NET MVC 4.0应用程序。 我可以使用ODP.NET提供程序连接到数据库,也可以针对数据库生成我的EDMX。 我不能做的是使用entity framework查询底层数据库。 使用生成的connectionString Visual Studio实例化我的DbContext时,出现以下错误: 无法找到请求的.Net Framework数据提供程序。 它可能没有安装 但是,它安装是因为 我可以在GAC中看到dll。 它在machine.config中提到。 它由我的项目引用。 我实际上用它来从数据库生成我的EDMX。 我已经确认我到处都引用了正确的版本(4.112.3.0) 我在Cassini本地运行代码,我的硬件是32位架构,所以我假设我只能使用32位DLL,所以这不是架构问题。 代码的具体位是这样的: public class MyContext : ObjectContext, IUnitOfWork { public MyContext() : base(ConfigurationManager .ConnectionStrings[“OracleEntities”] .ConnectionString)//Connectionstring is verified {} } 在我离开一切之前请帮助我,留胡子然后在某个地方住在山上。 解决方案 :由于我没有看到任何提及解决方案,我会在这里为后代提及它。 Andrei下面询问了我的连接字符串格式,虽然我很狡猾,但我去看看了。 这就是我所看到的: metadata=res://*/OracleModel.csdl|res://*/ OracleModel.ssdl|res://*/ OracleModel.msl; provider=provider=Oracle.DataAccess.Client; provider connection string="DATA SOURCE=localhost:1521; PASSWORD=xxx;PERSIST SECURITY […]

在C#中使用LIKE的Oracle绑定变量

作为停止使用动态SQL生成并鼓励使用绑定变量的努力的一部分,我遇到了一些问题。 我正在使用Oracle Data Providers for .NET从ASP.NET页面查询Oracle 9i数据库 查询是 sql = “SELECT somedata FROM sometable WHERE machine = :machineName “; 我按如下方式定义Oracle参数 OracleParameter parameter = new OracleParameter(); parameter.ParameterName = “machineName”; parameter.OracleDbType = OracleDbType.Varchar2; parameter.Value = machine; //machine is a variable of type string parameterList.Add(parameter); 这适用于“=”运算符。 但我似乎无法让它与“喜欢”一起工作。 我不知道如何格式化查询,以便它接受“%”通配符的使用。 我试过了: sql = “SELECT somedata FROM sometable WHERE machine LIKE […]