65.9K
CodeProject 正在变化。 阅读更多。
Home

ODP.NET 开发者指南:使用 Visual Studio 2005 和 Oracle Data Provider for .NET 进行 Oracle Database 10g 开发 - 第二章:连接到 Oracle

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (2投票s)

2007年8月10日

17分钟阅读

viewsIcon

101614

downloadIcon

5

面向使用 Oracle Data Provider for .NET 和 Visual Studio 2005 Oracle Developer Tools 的开发人员的实用指南

Screenshot - cover.jpg
标题 ODP.NET 开发者指南:使用 Visual Studio 2005 和 Oracle Data Provider for .NET 进行 Oracle Database 10g 开发
作者 Jagadish Chatarji Pulakhandam, Sunitha Paruchuri
出版社 Packt Publishing
出版日期 2007 年 6 月
ISBN 1847191967
价格 美国 49.99美元
页数 300

第二章:连接到 Oracle

从本章开始,我们将开始使用 ODP.NET 进行编程。本章主要关注以下内容:

  • 介绍 ADO.NET 2.0 中的提供程序无关模型
  • 使用 .NET 数据提供程序
  • 从 ADO.NET 2.0 连接到 Oracle 数据库的不同方法
  • 连接池、系统特权连接、Windows 身份验证

ADO.NET 2.0 中的提供程序无关模型

ADO.NET 在内部使用 .NET 数据提供程序(或 .NET 数据桥接提供程序)来连接和访问不同类型的数据源(包括数据库)。ADO.NET 1.1 中已存在的相同数据提供程序模型在 ADO.NET 2.0 中得到了进一步增强(通过新的工厂类),以利用开发数据库无关应用程序的灵活性。

工厂类到底是什么?工厂类的目的是提供一个接口,用于创建相关对象的族,而无需指定它们的具体(方法实现)类。如果工厂类在创建时不包含一个或多个方法的实现,我们就称之为抽象工厂类。

ADO.NET 2.0 中的提供程序无关编程模型围绕 `System.Data.Common` 命名空间中的类展开。在该命名空间中,主要有两个新工厂类实现了提供程序无关模型:

  • DbProviderFactories
  • DbProviderFactory

列出所有已安装的 .NET 数据提供程序

现在,让我们开始编程,列出您计算机上安装的所有 .NET 数据提供程序。.NET 数据提供程序相关的所有信息都存储在您计算机的 `machine.config` 文件中。每个提供程序通常都以其不变名称进行标识。不变名称(在大多数情况下)与其命名空间相同。

以下代码将列出您计算机上安装的所有 .NET 数据提供程序:

Imports System.Data.Common

Public Class Form1

    Private Sub btnProviders_Click(ByVal sender As 
        System.Object, ByVal e As System.EventArgs) Handles 
        btnProviders.Click

        Dim dt As DataTable = _
            DbProviderFactories.GetFactoryClasses()
        Me.DataGridView1.DataSource = dt

    End Sub

End Class

在上述代码中,`DbProviderFactories` 类主要用于枚举您计算机上安装的所有 .NET 数据提供程序。使用同一个类,我们还可以创建与特定提供程序相关的实例(以访问该提供程序的特定数据库)。要列出您计算机上安装的所有 .NET 数据提供程序,我们可以使用 `DbProviderFactories` 类中可用的 `GetFactoryClasses()` 方法。

上面高亮的代码行会查找并列出您计算机上安装的所有 .NET 数据提供程序(并将它们填充到数据表中)。当该代码执行时,输出应类似于以下内容:

Screenshot - 1960_02_01.jpg

根据上图,您可以看到该计算机已安装六个 .NET 数据提供程序。第三列表示用于标识每个提供程序的“不变名称”。

枚举所有可用的 Oracle 数据源

在上一节中,我们枚举了计算机上安装的所有 .NET 数据提供程序的列表。在之前的屏幕截图中,您应该会注意到示例中的计算机已安装 Oracle Data Provider for .NET,它以不变名称 `Oracle.DataAccess.Client` 进行标识。

在本节中,我们将枚举所有可用的 Oracle 数据源列表。让我们先逐步了解以下代码:

Imports System.Data.Common

Public Class Form2

    Private Sub btnDataSources_Click(ByVal sender As 
        System.Object, ByVal e As System.EventArgs) Handles 
        btnDataSources.Click

        Dim ProviderName As String = _
            "Oracle.DataAccess.Client"
        Dim fctry As DbProviderFactory = _
            DbProviderFactories.GetFactory(ProviderName)
        If (fctry.CanCreateDataSourceEnumerator) Then
            Dim dsenum As DbDataSourceEnumerator = _
                fctry.CreateDataSourceEnumerator()
            Dim dt As DataTable = dsenum.GetDataSources()
            Me.DataGridView1.DataSource = dt
       Else
            MessageBox.Show("No datasources found")
       End If

    End Sub

End Class

让我们一步一步地过一遍上面的代码。

以下语句选择了 ODP.NET 数据提供程序:

Dim ProviderName As String = "Oracle.DataAccess.Client"

.NET 数据提供程序名称就是相应 .NET 数据提供程序的“不变名称”。在之前的屏幕截图中,您可以看到有一个名为 `InvariantName` 的特殊列,用于标识相应的 .NET 数据提供程序。

以下语句创建了所选数据提供程序的工厂实例:

Dim fctry As DbProviderFactory = _
    DbProviderFactories.GetFactory(ProviderName)

创建工厂实例后,我们需要确定该提供程序(或实例)是否支持枚举数据源。这可以通过 `CanCreateDataSourceEnumerator()` 方法轻松完成(该方法返回一个布尔值)。

如果底层 .NET 数据提供程序支持枚举数据源,我们可以使用以下代码找到并检索相应 .NET 数据提供程序的所有数据源:

If (fctry.CanCreateDataSourceEnumerator) Then
    Dim dsenum As DbDataSourceEnumerator = _
        fctry.CreateDataSourceEnumerator()
    Dim dt As DataTable = dsenum.GetDataSources()
    Me.DataGridView1.DataSource = dt
Else
    MessageBox.Show("No datasources found")
End If

`CreateDataSourceEnumerator()` 方法只是创建一个枚举器。`GetDataSources()` 方法遍历所有现有的 Oracle 数据源。

当上面的代码执行时,输出应类似于以下内容:

Screenshot - 1960_02_02.jpg

在这里,XE 只是系统中运行的 Oracle 实例(SID)的名称,该实例安装了 Oracle 10g Express Edition。

到目前为止,我们只枚举了我们计算机上安装的所有 .NET 数据提供程序和 Oracle 数据源列表。在前面的代码中,我们还没有连接到 Oracle 数据库。

从 .NET 连接到 Oracle 数据库

有几种方法可以从 .NET 连接到 Oracle 数据库。这些方法各有优缺点,如第一章所述。现在,我们将探讨通过 .NET 连接到 Oracle 数据库的最流行的方法。

要连接到 Oracle,我们需要在系统上配置正确的连接描述符。这通常由 `tnsnames.ora` 文件处理。TNS 代表 Transparent Network Substrate(透明网络底层)。它提供了一个统一的应用程序接口,使网络应用程序能够访问底层网络协议。`tnsnames.ora` 只是一个文本文件,为 SQL*Net 提供 Oracle 服务器位置以及连接到 Oracle 数据库所需的连接字符串。此文件始终位于 Oracle 主目录的 `Network\Admin` 文件夹中。

如果 Oracle 客户端(或 SQL*Plus)已经能够连接到 Oracle 数据库服务器,那么 `tnsnames.ora` 文件就已经正确配置,您无需对其进行修改。但是,查看 `tnsnames.ora` 的内容对您更好地理解连接描述符很有帮助。以下是在某个计算机上的 `tnsnames.ora` 文件中的一个示例条目,用于连接到 Oracle(您的可能不同):

XE =
    (DESCRIPTION =
        (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
        )
        (CONNECT_DATA =
            (SERVICE_NAME = xe)
        )
    ) 

上面的配置脚本表明 Oracle 数据库服务器位于 127.0.0.1(本地计算机)上,并在端口 1521 上监听。连接到服务器的服务名(或 SID)是 xe。整个描述被分配给一个名称 XE。

我们将在示例中的大多数连接字符串中使用上述规范。

在构建连接字符串之前,请确保您已正确配置并测试了 `tnsnames.ora`,并且可以连接到 Oracle 数据库。如果您已经可以连接到 Oracle 数据库服务器,则无需进一步修改。但您应该知道您要连接到哪个主机。这一点很重要,因为 Oracle 客户端可以配置为同时连接到多个 Oracle 数据库服务器。您也可以使用图形向导 Net Configuration Assistant 配置和测试这些连接。

使用 .NET 数据提供程序工厂类进行连接

上一个主题介绍了 .NET 数据提供程序工厂类,本节将使用这些类连接到 Oracle 数据库。

以下代码演示了如何使用 .NET 数据提供程序工厂类连接到 Oracle 数据库:

Imports System.Data.Common

Public Class Form3

Private Sub btnConnect_Click(ByVal sender As 
    System.Object, ByVal e As System.EventArgs) Handles 
    btnConnect.Click

    'specify provider's invariant name
    Dim ProviderName As String = _
        "Oracle.DataAccess.Client"
    'create factory instance for the provider
    Dim fctry As DbProviderFactory = _
        DbProviderFactories.GetFactory(ProviderName)
    'create connection based on the factory
    Dim Connection As Data.Common.DbConnection
    Connection = fctry.CreateConnection
    'specify connection string
    Connection.ConnectionString = _
        "Data Source=xe;user id=scott;password=tiger"
    Try
        'try connecting to oracle
        Connection.Open()
        'close the connection before exiting
        Connection.Close()
        MessageBox.Show("Succesfully connected")
        Catch ex As Exception
        'display error message if not connected
        MessageBox.Show("Unable to connect. " & ex.Message)
    End Try
End Sub

End Class

从前面的代码中,我们有以下语句,用于为选定的 .NET 数据提供程序(在本例中为 `Oracle.DataAccess.Client`)创建工厂实例。

Dim ProviderName As String = _
    "Oracle.DataAccess.Client"
Dim fctry As DbProviderFactory = _
    DbProviderFactories.GetFactory(ProviderName)

继续向下,我们有以下内容:

Dim Connection As Data.Common.DbConnection
Connection = fctry.CreateConnection

`Data.Common.DbConnection` 可以简单地保存任何类型的数据库连接,而与数据源或数据提供程序无关。要从工厂实例创建数据库连接对象,我们可以使用 `CreateConnection()` 方法,该方法返回一个 `Data.Common.DbConnection` 类型的对象。一旦创建了 `DbConnection` 对象(通过工厂实例为相应的 .NET 数据提供程序),就需要提供数据库连接字符串信息,如下所示:

Connection.ConnectionString = _
    "Data Source=xe;user id=scott;password=tiger"

一旦 `DbConnection` 对象准备就绪,我们就可以打开连接以连接并与数据库进行交互。通常建议尽可能晚地打开数据库连接,并尽可能早地关闭它。以下代码片段尝试使用 `Open()` 方法打开连接,并使用 `Close()` 方法关闭它:

Try
    'try connecting to oracle
    Connection.Open()
    'close the connection before exiting
    Connection.Close()
    MessageBox.Show("Succesfully connected")
Catch ex As Exception
    'display error message if not connected
    MessageBox.Show("Unable to connect. " & ex.Message)
End Try

当您尝试开发数据库无关应用程序时,这种连接模型(和方法)是首选。

使用 .NET OLEDB 数据提供程序进行连接

当您尝试基于 ADO.NET 1.1 开发数据库无关应用程序时,通常首选此方法。如果您尝试基于 ADO.NET 2.0 开发数据库无关应用程序,则首选上一节提供的方法。

以下是使用 .NET OLEDB 数据提供程序连接到 Oracle 数据库的代码:

Imports System.Data.OleDb

Public Class Form4

    Private Sub btnConnect_Click(ByVal sender As 
        System.Object, ByVal e As System.EventArgs) Handles 
        btnConnect.Click
        Dim cn As New OleDbConnection
        cn.ConnectionString = "Provider=msdaora;
            Data Source=xe;User Id=scott;Password=tiger;"
        Try
            'try connecting to oracle
            cn.Open()
            'close the connection before exiting
            cn.Close()
            MessageBox.Show("Succesfully connected")
        Catch ex As Exception
            'display error message if not connected
            MessageBox.Show("Unable to connect. " & ex.Message)
        End Try
    End Sub

End Class

在上述代码中,`System.Data.oleDb` 命名空间用于处理 **.NET OLEDB 数据提供程序**。当处理 OLEDB 数据源时,我们需要通过 `OleDbConnection` 类进行连接。当处理 .NET OLEDB 数据提供程序连接到 Oracle 时,连接字符串信息也会有所不同。

以下是用于连接到 Oracle 数据库的新连接字符串,使用 .NET OLEDB 数据提供程序:

cn.ConnectionString = "Provider=msdaora;
    Data Source=xe;User Id=scott;Password=tiger;"

使用 .NET ODBC 数据提供程序进行连接

当您尝试使用 ADO.NET 开发多平台数据库无关应用程序时,可以使用此方法。如果您想连接到遗留系统或存在于其他平台上的数据库系统,则此方法是可取的。

以下是使用 .NET ODBC 数据提供程序连接到 Oracle 数据库的代码:

Imports System.Data.odbc

Public Class Form5

    Private Sub btnConnect_Click(ByVal sender As 
        System.Object, ByVal e As System.EventArgs) Handles 
        btnConnect.Click

        Dim cn As New OdbcConnection
        cn.ConnectionString = 
            "Driver={Microsoft ODBC for Oracle};
            Server=xe;Uid=scott;Pwd=tiger;"
        Try
            'try connecting to oracle
            cn.Open()
            'close the connection before exiting
            cn.Close()
            MessageBox.Show("Succesfully connected")
        Catch ex As Exception
            'display error message if not connected
            MessageBox.Show("Unable to connect. " & ex.Message)
        End Try
    End Sub

End Class

在前面的代码中,`System.Data.odbc` 命名空间用于处理 **.NET ODBC 数据提供程序**。当处理 ODBC 数据源时,我们需要通过 `OdbcConnection` 类进行连接。当处理 .NET ODBC 数据提供程序连接到 Oracle 时,连接字符串信息也会有所不同。以下是用于连接到 Oracle 数据库的新连接字符串,使用 .NET ODBC 数据提供程序:

cn.ConnectionString = "Driver={Microsoft ODBC for Oracle};
    Server=xe;Uid=scott;Pwd=tiger;"

使用 Microsoft 的 .NET Oracle 数据提供程序进行连接

Microsoft 添加了此提供程序,以方便开发人员连接和访问 Oracle 数据库。当您只需要访问 Oracle 数据库且您的计算机上未安装 ODP.NET 时,通常首选此方法。

在开始使用此提供程序之前,您需要像下图所示一样,将引用添加到程序集 `System.Data.OracleClient`:

Screenshot - 1960_02_03.jpg

添加完上述屏幕截图中所示的引用后,您可以继续使用以下代码通过 Microsoft 的 .NET Oracle 数据提供程序连接到 Oracle 数据库:

Imports System.Data.OracleClient

Public Class Form6

    Private Sub btnConnect_Click(ByVal sender As 
        System.Object, ByVal e As System.EventArgs) Handles 
        btnConnect.Click

        Dim cn As New OracleConnection
        cn.ConnectionString = _
            "Data Source=xe; User Id=scott;Password=tiger;"
        Try
            'try connecting to oracle
            cn.Open()
            'close the connection before exiting
            cn.Close()
            MessageBox.Show("Succesfully connected")
        Catch ex As Exception
            'display error message if not connected
            MessageBox.Show("Unable to connect. " & ex.Message)
        End Try
    End Sub

End Class

在上面的代码中,我们使用 `System.Data.OracleClient` 命名空间来处理 **Microsoft .NET Oracle 数据提供程序**。上述代码中使用的 `OracleConnection` 类位于同一命名空间中(请勿与 `Oracle.DataAccess.Client` 中提供的同名类混淆)。

使用 Oracle Data Provider for .NET (ODP.NET) 进行连接

此提供程序由 Oracle 提供,旨在方便开发人员连接和访问 Oracle 数据库,具有紧密的集成(以及最佳性能)和高级功能。即使您只需要访问 Oracle,此方法也是最佳的,因为 ODP.NET 与 Oracle 数据库具有紧密的集成。要使用此方法,您必须在计算机上下载(免费提供)并安装 ODP.NET。

在您的计算机上安装 ODP.NET 后,您需要将引用添加到程序集 `Oracle.DataAccess`。如果您安装了多个版本,则可能需要选择正确的版本。如果您使用的是 Visual Studio 2005 和 ODP.NET 10.2.0.2.20(支持 ADO.NET 2.0),请选择如下图所示:

Screenshot - 1960_02_04.jpg

添加完上图所示的引用后,您可以继续使用以下代码通过 ODP.NET 连接到 Oracle 数据库:

Imports oracle.DataAccess.Client

Public Class Form7

    Private Sub btnConnect_Click(ByVal sender As 
        System.Object, ByVal e As System.EventArgs) Handles 
        btnConnect.Click

        Dim cn As New OracleConnection
        cn.ConnectionString = _
            "Data Source=xe;User Id=scott;Password=tiger;"
        Try
            'try connecting to oracle
            cn.Open()
            'close the connection before exiting
            cn.Close()
            MessageBox.Show("Succesfully connected")
        Catch ex As Exception
            'display error message if not connected
            MessageBox.Show("Unable to connect. " & ex.Message)
        End Try
    End Sub

End Class

在上述代码中,`Oracle.DataAccess.Client` 命名空间用于处理 Oracle Data Provider for .NET (ODP.NET)。上述代码中使用的 `OracleConnection` 类位于同一命名空间中(请勿与 `System.data.OracleClient` 中提供的同名类混淆)。此数据提供程序与 .NET 数据提供程序工厂类的连接字符串信息可能是相同的(因为两者在内部都处理相同的命名空间)。

使用连接池进行连接

为每个客户端(或应用程序/用户)打开和维护数据库连接成本很高,并且会浪费大量资源。尤其是在 Web 应用程序开发过程中,这种情况尤其如此。为了克服此类场景,可以实现连接池。

连接池只是数据库连接的缓存。当数据库接收到来自客户端(或应用程序)的未来数据请求时,可以重用这些连接。客户端(或应用程序)会感觉好像它们各自拥有一个独立的数据库连接。

连接池默认启用,并且不仅限于 ODP.NET,还可用于其他 .NET 数据提供程序。您只需在连接字符串中添加 `pooling=false` 即可禁用连接池。您可以在连接字符串中使用自己的规范来自定义池。

以下是作为连接字符串一部分的自定义连接池的简单演示:

Imports oracle.DataAccess.Client

Public Class Form7

    Private Sub btnConnect_Click(ByVal sender As 
        System.Object, ByVal e As System.EventArgs) Handles 
        btnConnect.Click

        Dim cn As New OracleConnection
        cn.ConnectionString = "Data Source=xe;
            User id=scott;Password=tiger;
            Min Pool Size= 5;
            Connection Lifetime=120;
            Connection Timeout=60;
            Incr Pool size=2;
            Decr Pool size=1"
        Try
            'try connecting to oracle
            cn.Open()
            'close the connection before exiting
            cn.Close()
            MessageBox.Show("Succesfully connected")
        Catch ex As Exception
            'display error message if not connected
            MessageBox.Show("Unable to connect. " & ex.Message)
        End Try
    End Sub

End Class

代码中的连接字符串定义了几个参数。`ConnectionLifetime` 设置连接池中连接对象的最大生存期(以秒为单位)。`ConnectionTimeout` 是在引发错误之前等待与服务器连接的最大秒数。`MinPoolSize` 是它需要在任何时候持有的连接对象的数量(同样,也有 `MaxPoolSize`)。根据请求的需求和活动情况,连接池中的连接数量会根据 `IncrPoolsize` 和 `DecrPoolsize` 的规范而减少或增加。

使用系统级特权或 DBA 特权进行连接

DBA 级特权主要侧重于特定用户的数据库对象级访问。与普通数据库级(甚至对象级)特权相比,系统级特权更为特殊。连接到系统级特权时,您甚至可以在数据库启动之前对其进行管理。

两个主要的系统级特权是 SYSDBA 和 SYSOPER。当您以 SYSDBA 身份登录时,默认模式为 `SYS`,而使用 SYSOPER 时,默认模式为 `PUBLIC`。SYSDBA 是 SYSOPER 的超集。

使用系统级特权连接时,与 DBA 特权一起工作是显而易见的。如果您不需要在系统级别工作,而只需要访问少数 DBA 对象,则无需使用系统级特权进行连接。

如果需要 .NET 应用程序使用系统级特权连接到 Oracle,只需将连接参数添加到现有连接字符串中,如下所示:

Imports oracle.DataAccess.Client

Public Class Form7

    Private Sub btnConnect_Click(ByVal sender As 
        System.Object, ByVal e As System.EventArgs) Handles 
        btnConnect.Click

        Dim cn As New OracleConnection

        cn.ConnectionString = "Data Source=xe;
            User id=system;Password=manager;
            DBA Privilege=SYSOPER"
        Try
            'try connecting to oracle
            cn.Open()
            'close the connection before exiting
            cn.Close()
            MessageBox.Show("Succesfully connected")
        Catch ex As Exception
            'display error message if not connected
            MessageBox.Show("Unable to connect. " & ex.Message)
        End Try
    End Sub

End Class

在上述语句中,您可以观察到用户名是 system(这是一个 DBA 用户),特权是 SYSDBA。

使用 OracleConnectionStringBuilder 和 app.config 进行动态连接字符串构建

您可以使用 ODP.NET 10.2.0.2 中提供的 `OracleConnectionStringBuilder` 类动态构建连接字符串。如果您在 .NET 配置文件(如 `app.config` 或 `web.config`)中有任何 Oracle 连接参数,这将非常有帮助。

现在,让我们通过使用解决方案属性将一些 Oracle 连接参数添加到 `app.config` 文件中,如下所示:

Screenshot - 1960_02_05.jpg

添加上图所示参数后,您可以开发以下代码,使用 `OracleConnectionStringBuilder`(稍后解释)动态创建连接字符串:

Imports Oracle.DataAccess.Client

Public Class Form9

    Private Function getConnectionString() As String
        Dim cnBuilder As New OracleConnectionStringBuilder
        With cnBuilder
            .DataSource = My.Settings.DataSource
            .UserID = My.Settings.UserID
            .Password = My.Settings.Password
        End With
        Return cnBuilder.ConnectionString
    End Function

    Private Sub btnConnect_Click(ByVal sender As 
        System.Object, ByVal e As System.EventArgs) Handles 
        btnConnect.Click

        Dim cn As New OracleConnection
        cn.ConnectionString = getConnectionString()
        Try
            'try connecting to oracle
            cn.Open()
            'close the connection before exiting
            cn.Close()
            MessageBox.Show("Succesfully connected")
        Catch ex As Exception
            'display error message if not connected
            MessageBox.Show("Unable to connect. " & ex.Message)
        End Try
    End Sub

End Class

从上面的代码中,您可以观察到我们尝试使用 .NET Framework 2.0 中引入的 My 对象从 `app.config` 文件检索所有连接参数。`OracleConnectionStringBuilder` 对象只需设置几个属性(如 `DataSource`、`UserID`、`Password` 等)。设置好属性后,它会自动在内部构建连接字符串,并在使用 `ConnectionString` 属性时返回此字符串。

嵌入类似 "tnsnames.ora" 的连接字符串条目

在以上所有示例中,我们都直接使用了 `tnsnames.ora` 文件中的规范。您也可以直接在连接字符串中定义自己的类似 `tnsnames.ora` 的条目。以下是无 `tnsnames.ora` 连接的代码:

Imports oracle.DataAccess.Client

Public Class Form7

    Private Sub btnConnect_Click(ByVal sender As 
        System.Object, ByVal e As System.EventArgs) Handles 
        btnConnect.Click

        Dim cn As New OracleConnection
        Dim ConnStr As String
        ConnStr = "Data Source = "
        ConnStr &= "(DESCRIPTION = "
        ConnStr &= " (ADDRESS_LIST ="
        ConnStr &= " (ADDRESS = (PROTOCOL = TCP)
            (HOST = 127.0.0.1)(PORT = 1521))"
        ConnStr &= " )"
        ConnStr &= " (CONNECT_DATA ="
        ConnStr &= " (SERVICE_NAME = xe)"
        ConnStr &= " )"
        ConnStr &= ");"
        ConnStr &= "User Id=scott;"
        ConnStr &= "password=tiger;"
        cn.ConnectionString = ConnStr

        Try
            'try connecting to oracle
            cn.Open()
            'close the connection before exiting
            cn.Close()
            MessageBox.Show("Succesfully connected")
        Catch ex As Exception
            'display error message if not connected
            MessageBox.Show("Unable to connect. " & ex.Message)
        End Try
    End Sub

End Class

在上面的代码中,我们只是复制并粘贴了 `tnsnames.ora` 中的条目,它就能正常工作。您也可以使上面的连接字符串动态化(例如,如果您想在不同时间连接到不同的数据源),方法是在窗体中添加文本框,并将这些值与上述连接字符串连接起来。

连接到默认 Oracle 数据库

在所有先前的方法中,我们在连接字符串中指定了数据源或服务器值来连接到 Oracle 实例(使用 SID)。有时,我们可能需要连接到与 .NET 应用程序位于同一台计算机上的默认 Oracle 数据库(而不是任何其他网络服务器)。

连接到默认 Oracle 数据库完全取决于您注册表中可用的 `ORACLE_SID` 键(如下所示)。如果您的 Oracle 主目录中没有该键,您也可以手动添加它。添加该键后,您可以定义不带数据源或服务器规范的连接字符串。

Screenshot - 1960_02_06.jpg
即使您可以通过“环境变量”对话框添加此 `ORACLE_SID`,但如果您在同一台计算机上安装了多个 Oracle 版本,则不建议使用此方法。

在注册表中通过 `ORACLE_SID` 注册表项设置默认 Oracle 数据库后,可以修改连接字符串,使其更简单(无需指定任何数据源或服务器规范),如下所示:

cn.ConnectionString = "User Id=scott;Password=tiger;"

使用 Windows 身份验证(单点登录)进行连接

这与之前任何连接到 Oracle 数据库的类型完全不同。Windows 身份验证只是使用 Windows 用户凭据对 Oracle 数据库进行身份验证的过程。单点登录是即使不提供任何凭据(通过考虑现有的 Windows 用户凭据)也可以对 Oracle 数据库进行身份验证的过程。

要实现 100% 的单点登录以对 Oracle 数据库进行身份验证,没有直接的解决方案。但是,我们需要将用户 ID 提供为“/”,这将自动携带我们当前的 Windows 用户凭据以对 Oracle 数据库进行身份验证。通过利用此功能,我们可以开发实现 100% Oracle 数据库单点登录的 .NET 应用程序。

主要来说,Windows 身份验证到 Oracle 数据库不是一个直接的过程。即使它不是一个非常复杂的过程,我们也需要进行一些配置,这些配置需要使用数据库管理员权限来设置。要获得成功的 Windows 身份验证(或单点登录)到 Oracle 数据库的 Windows 用户,我们必须首先找到两个重要值:

  • 操作系统身份验证前缀(`init.ora` 文件中的 `os_authent_prefix` 参数)
  • Windows 用户名(以及主机名或域名)

操作系统身份验证前缀在 Oracle 安装期间配置,并在 `init.ora` 文件中作为 `os_authent_prefix` 参数可用。我们需要使用此值作为 Windows 用户凭据的前缀。要检索该参数的值,您需要使用以下语句:

SQL> show parameter os_authent_prefix

您可能需要 DBA 权限(或以 system/sysdba/sysoperuser 身份登录)才能执行这些任务。

您可以通过登录对话框轻松获取完整的用户名(包括主机名或域名)。您甚至可以使用以下 VB.NET 代码动态获取它:

Private Sub btnWindowsUser_Click(ByVal sender As 
    System.Object, ByVal e As System.EventArgs) Handles 
    btnWindowsUser.Click

    Dim WindowsUser As String = My.User.Name
    MessageBox.Show(WindowsUser)
End Sub

一旦您找到这两个值,您就需要使用与 Windows 用户名(以及主机/域名)相同的名称在 Oracle 中创建一个用户,并在前面加上 `os_authent_prefix` 的值,并授予足够的特权以使用户能够连接。

有时,`os_authent_prefix` 的值可能是空的(或无值)。在这种情况下,您无需在 Windows 用户名前加上任何前缀。

您可以发出以下语句来创建 Windows 用户并授予其特权:

SQL> CREATE USER "PS$LAPTOP2K3\ADMINISTRATOR" 
    IDENTIFIED EXTERNALLY;
SQL> GRANT connect, resource TO 
    "PS$LAPTOP2K3\ADMINISTRATOR"

在上面的命令中,`PS$` 是我计算机上 `os_authent_prefix` 的参数值,`LAPTOP2K3\ADMINISTRATOR` 是 Windows 用户。如果 `os_authent_prefix` 没有值(或为空),则无需在 Windows 用户名前加上任何值。一旦上述设置配置正确,您应该能够使用以下命令在 SQL 提示符下连接到该用户:

SQL> connect /

您可以观察到,使用“/”连接到 Oracle 数据库非常简单,这会告知它使用 Windows 身份验证。同样,您可以按如下方式修改 .NET 中的连接字符串,以实现到 Oracle 数据库的单点登录身份验证(带有 Windows 身份验证):

Dim cn As New OracleConnection
cn.ConnectionString = "Data Source=xe;User Id=/;"

摘要

在本章中,我们回顾了 ADO.NET 2.0 中提供程序无关模型的策略,使用该模型列出了已安装的 .NET 数据提供程序和数据源,并最终开发了代码,使用所有可用方法从 .NET 连接到 Oracle 数据库。

© . All rights reserved.