我们的应用程序中的数据访问层将使用Oracle的UDT功能.我们只会将UDT对象传入和传出数据库.
目前,我们使用ODP.NET提供的函数生成自定义类(它创建了一个我们在代码库中真正不需要的真正可怕的类).
然后,我们使用单独的映射类将自定义类映射到我们的一个业务对象(并在保存时返回).
我想找到一个更好的方法来做到这一点.
我想我只是去处理生成的类,然后编写一个实现了IOracleCustomType的映射类.然后,From/ToCustomObject方法将从我的UDT映射到我的业务对象.但是,当我尝试它时,这会给我带来问题 - 我收到错误"对象属性未映射到自定义类型成员".看来这两个方法,我也需要我的映射类中的属性 - UDT中每个项目的一个属性.
例如,工作流UDT包含三个项目 - 状态,创建时间和创建时间.我的UDT很简单:
TYPE workflow_type AS OBJECT
(status VARCHAR2(8)
,created_by VARCHAR2(30)
,created_datetime DATE
);
Run Code Online (Sandbox Code Playgroud)
我希望它最终成为业务对象:
public class Workflow
{
/// <summary>
/// Gets the status of the workflow.
/// </summary>
/// <value>The status.</value>
public string Status { get; private set; }
/// <summary>
/// Gets the Windows Logon Id of the user performing the action
/// </summary>
public string CreatedBy{ get; private set; }
/// <summary>
/// Gets the time of …
Run Code Online (Sandbox Code Playgroud) 我无法让ODP.NEt库与.NET DBProviderFactories一起使用.我使用此代码收到以下错误:
_DBFactory = DbProviderFactories.GetFactory(providerName);
Run Code Online (Sandbox Code Playgroud)
为system.data创建配置节处理程序时发生错误:列'InvariantName'被限制为唯一.值'Oracle.DataAccess.Client'已存在.
使用此providerName:Oracle.DataAccess.Client
以及web.config中的以下条目:
<system.data>
<DbProviderFactories>
<add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description=".Net Framework Data Provider for Oracle" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
Run Code Online (Sandbox Code Playgroud)
有谁知道什么是错的?我不认为我在任何地方设置了两次.
我正在使用ODP.NET,我需要从我的数据库生成ORM.
我安装了:
在Server Expolorer中,我可以看到Oracle数据库的数据源,我可以连接到远程oracle服务器并运行查询.
当我添加ADO.NET实体数据模型,并想生成数据库代码我不能看到Oracle数据源就像在服务器资源管理器.
你需要下载一些额外的东西来运行ODP.NET的实体框架吗?
编辑:
我正在尝试为在.net中使用Oracle的应用程序套件编写数据访问库.我们目前正在使用NHibernate并且正在考虑迁移,因为它看起来并不是很好.
我正在使用Visual Studio 2013,我们已经构建了Oracle数据库.我们没有写更新它(这是db人员的域).所以这不会成为我们最终计算的一部分.
服务器上的客户端是32位,所以我们现在要坚持使用它.它已经是GAC了,没有必要改变它.所以我们的开发盒上有32位客户端.
我通过nuget将EntityFramework 6.1.0安装到我的项目中.我在我的项目中安装了ODAC 1.112.3.20.32位版本的应用程序.我也安装了ODP.net.x86驱动程序(也通过nuget).
问题是每次我尝试创建ADO.net数据库连接时,oracle提供程序永远不是一个选项?我错过了什么?我需要什么才能让它发挥作用?
我曾经读过一个oracle论坛,说我需要将我的实体框架设置为5.0而不是6.0.哪个好,但我该怎么做?
使用Visual Studio 2013,我使用Nuget将最新版本的ODP.NET Managed添加到项目中:
Install-Package odp.net.managed
Run Code Online (Sandbox Code Playgroud)
http://www.nuget.org/packages/odp.net.managed/121.1.2
现在,当我尝试运行以下代码时:
Database db = DatabaseFactory.CreateDatabase();
Run Code Online (Sandbox Code Playgroud)
它抛出以下异常:
An exception of type 'System.ArgumentException' occurred
in System.Data.dll but was not handled in user code
Additional information: Unable to find the requested .Net
Framework Data Provider. It may not be installed.
Run Code Online (Sandbox Code Playgroud)
在阅读其他用户的类似问题后,我将托管驱动程序部分添加到C:\ Windows\Microsoft.Net\Framework64\v4.0.30319\Config\machine.config:
<system.data>
<DbProviderFactories><add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
<add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, …
Run Code Online (Sandbox Code Playgroud) 在我的计算机上安装了托管ODP.NET后,ODP.NET托管驱动程序不会出现在Visual Studio 2013 Professional中的"选择数据源"对话框中.
它应该是这样的:
这就是它在我的机器上的实际外观:
我已经按照Oracle网站上" An Easy Drive to .NET "一文中描述的步骤进行操作.
我还安装了Visual Studio的Oracle Developer Tools.仍然没有托管驱动程序可供选择
我的问题:
为了让数据提供者出现,有什么我忘了做的吗?
尝试使用ODP .NET连接时出现ORA-12154错误
更新:Wernfried的回答为我解决了.
创建一个环境变量TNS_ADMIN = D:\ oracle\product\12.1.0\dbhome_1 \network\admin
Sqlplus从Registry读取TNS_ADMIN但ODP.NET托管驱动程序不读取注册表.另请参阅: OdbcConnection将中文字符返回为"?"
您可以通过以下方式检查环境变量:
string tns_admin = Environment.GetEnvironmentVariable("TNS_ADMIN")
Run Code Online (Sandbox Code Playgroud)
我并没有完全理解他建议的链接是如何相关的.
原始问题:
尝试使用ODP .NET连接时出现ORA-12154错误
代码:
OracleConnection oracleConnection = new OracleConnection();
string connectionString = "User Id=redacted;Password=redacted;Data Source=db6";
oracleConnection.ConnectionString = connectionString;
oracleConnection.Open();
Run Code Online (Sandbox Code Playgroud)
错误:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> Oracle.ManagedDataAccess.Client.OracleException: ORA-12154: TNS:could not resolve the connect identifier specified ---> OracleInternal.Network.NetworkException: ORA-12154: TNS:could not resolve the connect identifier specified
at OracleInternal.Network.AddressResolution..ctor(String TNSAlias, String instanceName)
at OracleInternal.Network.OracleCommunication.DoConnect(String tnsDescriptor)
at OracleInternal.Network.OracleCommunication.Connect(String
Run Code Online (Sandbox Code Playgroud)
我的tnsnames.ora:
# tnsnames.ora …
Run Code Online (Sandbox Code Playgroud) 我正在使用oracle和Sql的实体框架6.Timespan数据类型不适用于oracle.所以我将数据类型更改为datetime.现在我想只比较日期时间与Linq查询的时间.恩.
var db0010016 = _idb0010016Rep.GetAll().Where(e => e.ExecutionTime.TimeOfDay == viewmodel.ExecutionTime).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,e.ExecutionTime是datetime,viewmodel.ExecutionTime是时间跨度.我正在使用timeofday函数将其转换为时间跨度
上面的查询无法执行所以我使用了DbFunctions.CreateTime()函数
var db0010016 = _idb0010016Rep.FindBy(e => DbFunctions.CreateTime(e.ExecutionTime.Hour, e.ExecutionTime.Minute, e.ExecutionTime.Second) == exetime).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
以上ex exetime是timespan.still我得到低于错误
{"Invalid parameter binding\r\nParameter name: ParameterName"}
Run Code Online (Sandbox Code Playgroud) 我可能在这里提出错误的问题,如果是的话,我愿意改变它.
我有一个使用Microsoft.NET Oracle提供程序的项目(我们的计划是更改为ODP,但我们还没有这样做).
我试图让这个项目在Windows 2008(x64)构建服务器上构建.它构建得很好但我们的单元测试在他们点击Oracle数据库上的东西时失败了.
我最初安装了32位oracle 9i客户端,这是我们目前在winxp开发盒和之前的2003构建服务器上使用的.但现在这会得到如下消息:尝试加载Oracle客户端库会引发BadImageFormatException.在安装了32位Oracle客户端组件的64位模式下运行时,将发生此问题.
我们尝试编译到x86平台,但没有更改错误消息.
我现在安装了11g 64位客户端,但是我收到一条消息,说System.Data.OracleClient需要Oracle客户端软件版本8.1.7或更高版本.
那么我应该使用Oracle安装什么?
编辑:
我能够让这个工作.原来这是导致问题的测试,迫使NUnit以32位模式运行:http://geekswithblogs.net/Lance/archive/2006/12/28/102191.aspx我能够让测试工作使用旧的32位驱动程序.对于这个问题,这将是一个糟糕的答案,所以我没有使用它,但很乐意为任何向转换到Oracle 64位驱动程序提供一些好信息的人给出正确的答案.
我的开发团队ORA-12571: TNS:packet writer failure
使用ASP.NET 3.5和4.0对Oracle 11g 遇到了很多错误.这些错误在它们何时发生时是不一致的,并且由许多应用程序生成.调用随机存储过程,数据包和内联SQL语句时会发生此异常.Oracle 11客户端安装在Web服务器上.某些应用程序使用Microsoft System.Data.OracleClient连接到Oracle,有些应用程序使用oracle(ODP.NET)提供的.NET组件.两个数据访问对象都会出现相同的错误.
还有其他非.NET应用程序在不同的Web服务器上运行,但使用相同的数据库服务器.这些应用程序没有任何此类问题.我最初的想法是,使用Oracle客户端在Web服务器上配置错误.
有没有其他人收到此错误?你做了什么修复它?
ORA-12571: TNS:packet writer failure
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, ArrayList& resultParameterOrdinals)
at System.Data.OracleClient.OracleCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.OracleClient.OracleCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet …
Run Code Online (Sandbox Code Playgroud)