C# 连接 Oracle 的几种方式

在企业级应用开发中,与数据库的交互是非常常见的需求。Oracle 作为一款功能强大的数据库管理系统,在许多大型项目中被广泛使用。C# 作为一种流行的编程语言,提供了多种方式来连接 Oracle 数据库。本文将详细介绍这些连接方式,帮助开发者根据不同的项目需求选择合适的方法。

目录#

使用 Oracle.ManagedDataAccess.Client 连接#

简介#

Oracle.ManagedDataAccess.Client 是 Oracle 官方提供的托管驱动程序,它不需要安装 Oracle 客户端,简化了部署过程。

安装#

可以通过 NuGet 包管理器安装 Oracle.ManagedDataAccess.Core 包。

示例代码#

using Oracle.ManagedDataAccess.Client;
 
class Program
{
    static void Main()
    {
        string connectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=your_host)(PORT=your_port))(CONNECT_DATA=(SERVICE_NAME=your_service_name)));User Id=your_username;Password=your_password;";
        using (OracleConnection connection = new OracleConnection(connectionString))
        {
            try
            {
                connection.Open();
                OracleCommand command = new OracleCommand("SELECT * FROM your_table", connection);
                OracleDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    // 处理读取的数据
                }
                reader.Close();
            }
            catch (OracleException ex)
            {
                Console.WriteLine($"Oracle 异常: {ex.Message}");
            }
        }
    }
}

常见实践#

  • 确保连接字符串的正确性,特别是 HOSTPORTSERVICE_NAMEUSER IDPASSWORD 等参数。
  • 使用 using 语句来确保连接和相关资源的正确释放。

使用 ODP.NET 非托管驱动连接#

简介#

ODP.NET 非托管驱动需要安装 Oracle 客户端,它在一些旧项目或者对性能有特定要求的场景中可能会被使用。

安装#

  1. 下载并安装 Oracle 客户端。
  2. 在项目中添加对 Oracle.DataAccess.dll 的引用(通常位于 Oracle 客户端安装目录下)。

示例代码#

using Oracle.DataAccess.Client;
 
class Program
{
    static void Main()
    {
        string connectionString = "Data Source=your_tns_name;User Id=your_username;Password=your_password;";
        using (OracleConnection connection = new OracleConnection(connectionString))
        {
            try
            {
                connection.Open();
                OracleCommand command = new OracleCommand("SELECT * FROM your_table", connection);
                OracleDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    // 处理读取的数据
                }
                reader.Close();
            }
            catch (OracleException ex)
            {
                Console.WriteLine($"Oracle 异常: {ex.Message}");
            }
        }
    }
}

常见实践#

  • 正确配置 Oracle 客户端的环境变量(如 TNS_ADMIN 指向 tnsnames.ora 文件所在目录)。
  • 注意不同版本的 Oracle 客户端和驱动的兼容性。

使用 Entity Framework 连接#

简介#

Entity Framework 是一个对象关系映射(ORM)框架,它可以简化数据库操作的代码编写。通过配置,也可以使用它来连接 Oracle 数据库。

安装#

  1. 安装 EntityFrameworkOracle.ManagedDataAccess.EntityFramework(如果使用托管驱动)或者 Oracle.DataAccess.EntityFramework(如果使用非托管驱动)NuGet 包。
  2. 配置 DbContext

示例代码(使用托管驱动示例)#

using System.Data.Entity;
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.EntityFramework;
 
public class YourDbContext : DbContext
{
    static YourDbContext()
    {
        Database.SetInitializer<YourDbContext>(null);
        OracleEFProviderServices.Instance.UseEntityFramework();
    }
 
    public YourDbContext() : base("name=YourConnectionString")
    {
    }
 
    public DbSet<YourEntity> YourEntities { get; set; }
}
 
public class YourEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
}
 
class Program
{
    static void Main()
    {
        using (var context = new YourDbContext())
        {
            var entities = context.YourEntities.ToList();
            foreach (var entity in entities)
            {
                Console.WriteLine($"Id: {entity.Id}, Name: {entity.Name}");
            }
        }
    }
}

常见实践#

  • 正确配置 DbContext 和连接字符串。
  • 遵循 Entity Framework 的最佳实践,如代码优先或数据库优先的开发模式。

最佳实践#

  • 连接字符串管理:将连接字符串存储在配置文件(如 app.configweb.config)中,方便管理和修改。
  • 异常处理:对数据库操作可能出现的异常进行全面的捕获和处理,提供有意义的错误信息。
  • 性能优化
    • 避免频繁打开和关闭连接,尽量复用连接。
    • 对查询进行优化,使用合适的索引等数据库优化手段。
  • 安全性
    • 不要在代码中硬编码密码等敏感信息。
    • 对用户输入进行验证,防止 SQL 注入攻击(虽然在使用参数化查询时可以大大降低风险,但仍需注意)。

参考#