使用OLEDB连接Oracle数据库无法获取对象属性的原因

出于效率及编程便利性考虑(CAD Client的连接速度实在是有点慢),在查询对象属性数据时往往是使用OLEDB直接连接Oracle进行相关查询的。然而,使用中发现偶尔会出现无法获取对象属性的问题。经分析,发现问题出在版本功能上。

SDE提供了版本管理功能,用户可以很方便的进行图形的审批、回滚等操作。然而,此功能在Oracle中需要其它表的辅助,主要包括了A表和D表。ArcSDE建立了版本后,关于表空间数据的增加、修改均通过相应的A表和D表实现。由于直接使用OLEDB在访问时只查询到没有修改的版本基表,因而无法检索到创建版本之后新增加或者修改的对象的信息。

有关版本的具体机制可参见:
http://gis.esri.com/library/userconf/proc01/professional/papers/pap232/p232.htm

解决该问题的有两类方案:修改系统查询机制,或者是在Oracle中建立相关的视图。
若采用修改系统的方法,考虑到SDE CAD Client效率较低,则应考虑采用SDE提供的C API重写相关代码,相对修改较大。
若采用建立视图的方法,则可使用指令sdetable,把操作定为create_mv_view,即可针对指定的表建立相应的视图,并把相关的权限赋予对应的Oracle帐号即可。但每个注册为版本的要素类都需要建立对应的视图才可以避免上述问题产生。
以下简单列一下几个解决方案的优缺点。

  CAD Client  C API  OLEDB
 查询速度 慢 快 快
 是否需开发代码 是 是 否
 自适应性  好 好 差 
 修复此问题时间  慢 慢 快

 

### 回答1: 如果要使用 OleDb 连接非本机的 Oracle 数据库,需要在连接字符串中指定数据库的 IP 地址和端口号。具体步骤如下: 1. 引用 OleDb 命名空间。 ```csharp using System.Data.OleDb; ``` 2. 创建连接字符串。 ```csharp string connectionString = "Provider=MSDAORA;Data Source=IP_ADDRESS:PORT/SERVICE_NAME;User ID=yourUsername;Password=yourPassword;"; ``` 其中,Data Source 中的 IP_ADDRESS 和 PORT 分别指定了要连接数据库服务器的 IP 地址和端口号,SERVICE_NAME 指定了数据库的服务名或 SID。如果不知道服务名或 SID,可以在数据库服务器上运行命令 `lsnrctl status` 查看。 3. 创建 OleDbConnection 对象。 ```csharp OleDbConnection connection = new OleDbConnection(connectionString); ``` 4. 打开数据库连接。 ```csharp connection.Open(); ``` 5. 执行 SQL 命令。 ```csharp OleDbCommand command = new OleDbCommand("SELECT * FROM yourTable", connection); OleDbDataReader reader = command.ExecuteReader(); while (reader.Read()) { // 处理查询结果 } ``` 6. 关闭数据库连接。 ```csharp connection.Close(); ``` 需要注意的是,以上代码仅供参考,实际应用中可能需要根据具体情况进行调整。另外,如果使用的是 .NET Core,需要使用 Oracle 提供的 .NET Core 数据库驱动程序,而不是 OleDb。 ### 回答2: 使用OleDb连接非本机的Oracle数据库的流程如下: 第一步,将OleDb数据提供程序添加到项目中。这可以通过在Visual Studio中的项目中添加对应的引用来完成。 第二步,创建一个OleDbConnection对象并设置数据库连接字符串。连接字符串包括数据库的位置、用户名和密码等信息。例如,可以使用以下连接字符串连接Oracle数据库: "Provider=OraOLEDB.Oracle;Data Source=服务器地址/数据库实例名;User ID=用户名;Password=密码" 第三步,打开数据库连接使用OleDbConnection对象的Open方法来打开连接。 第四步,创建并执行SQL查询或命令。可以使用OleDbCommand对象来执行SQL查询或命令。首先创建一个OleDbCommand对象,设置查询语句,并将其与已打开的连接相关联。然后,使用OleDbCommand对象的ExecuteReader、ExecuteNonQuery或ExecuteScalar方法执行查询。 第五步,处理查询结果。根据查询的需求,使用OleDbDataReader对象来读取和处理查询返回的数据使用OleDbDataReader对象的Read方法来逐行读取查询结果,并使用相应的方法来获取特定列的值。 第六步,关闭数据库连接使用OleDbConnection对象的Close方法来关闭连接,以释放与数据库连接,并确保在不需要连接时节省资源。 需要注意的是,要使用OleDb连接非本机的Oracle数据库,需要确保已经正确安装Oracle客户端,并且数据库服务器可以通过网络访问。同时,还需要确保使用连接字符串中提供了正确的服务器地址、数据库实例名、用户名和密码等信息。 以上就是使用OleDb连接非本机的Oracle数据库的流程。 ### 回答3: OleDb(Object Linking and Embedding for Databases)是一种用于在Windows平台上连接和操作数据库的技术。要连接非本机的Oracle数据库,需要按照以下流程进行操作: 1. 导入OleDb命名空间:在代码中导入OleDb命名空间,以便使用其中提供的类和方法。 2. 创建OleDb连接对象使用OleDbConnection类创建一个连接对象,这个对象将用于连接Oracle数据库。 3. 设置连接字符串:使用OleDbConnection对象的ConnectionString属性设置连接字符串。连接字符串应包含非本机Oracle数据库的地址、用户名和密码等信息。 4. 打开连接使用OleDbConnection对象的Open()方法打开连接。 5. 执行SQL语句:使用OleDbConnection对象的ExecuteNonQuery()、ExecuteScalar()或ExecuteReader()等方法执行需要在Oracle数据库中执行的SQL语句。 6. 关闭连接:在完成对数据库的操作后,使用OleDbConnection对象的Close()方法关闭连接。 7. 释放资源:使用OleDbConnection对象的Dispose()方法释放连接对象占用的系统资源。 需要注意的是,在连接非本机Oracle数据库时,连接字符串的设置非常重要。连接字符串中应包含正确的数据库地址、用户名和密码,以确保能够成功连接到目标数据库。另外,还需要确保计算机上已经正确安装了相应的Oracle客户端驱动程序。 以上是连接非本机Oracle数据库的大致流程,具体的细节和代码实现可能会有所不同,具体操作可以参考OleDb连接Oracle数据库的相关文档和示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值