在C#中操作Oracle数据库,通常有几种不同的方法可供选择,以下是详细的介绍:
一、使用System.Data.OracleClient
1、引用添加:在项目中添加对System.Data.OracleClient
的引用,虽然微软已不推荐使用,但在某些旧项目中仍可能会用到。
2、连接字符串配置:可以在配置文件(如App.config或Web.config)中配置连接字符串,也可以直接在代码中编写。
<connectionStrings> <add name="OracleConnStr" connectionString="Data Source=服务器地址;User ID=用户名;Password=密码" providerName="System.Data.OracleClient"/> </connectionStrings>
或者在代码中直接写:
string connString = "Data Source=服务器地址;User ID=用户名;Password=密码";
3、数据库操作示例:
连接数据库:
using (OracleConnection conn = new OracleConnection(connString)) { conn.Open(); // 后续操作 }
执行查询命令:
using (OracleConnection conn = new OracleConnection(connString)) { conn.Open(); OracleCommand cmd = new OracleCommand("SELECT * FROM 表名", conn); OracleDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { // 处理查询结果 } }
执行非查询命令(如插入、更新、删除等):
using (OracleConnection conn = new OracleConnection(connString)) { conn.Open(); OracleCommand cmd = new OracleCommand("INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2)", conn); int rowsAffected = cmd.ExecuteNonQuery(); }
二、使用Oracle.DataAccess.Client(ODP.NET)
1、引用添加:通过NuGet包管理器安装Oracle.ManagedDataAccess
或Oracle.DataAccess
(较老版本),在项目中添加对相应DLL的引用。
2、连接字符串配置:与System.Data.OracleClient
类似,可以在配置文件或代码中配置。
<connectionStrings> <add name="OracleConnStr" connectionString="User Id=myusername;Password=mypassword;Data Source=//localhost:1521/orcl" /> </connectionStrings>
或者在代码中直接写:
string connString = "User Id=myusername;Password=mypassword;Data Source=//localhost:1521/orcl";
3、数据库操作示例:
连接数据库:
using (OracleConnection conn = new OracleConnection(connString)) { conn.Open(); // 后续操作 }
执行查询命令:
using (OracleConnection conn = new OracleConnection(connString)) { conn.Open(); OracleCommand cmd = new OracleCommand("SELECT * FROM mytable", conn); OracleDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { // 处理查询结果 } }
执行非查询命令(如插入、更新、删除等):
using (OracleConnection conn = new OracleConnection(connString)) { conn.Open(); OracleCommand cmd = new OracleCommand("INSERT INTO mytable (column1, column2) VALUES (:value1, :value2)", conn); cmd.Parameters.Add("value1", value1); cmd.Parameters.Add("value2", value2); int rowsAffected = cmd.ExecuteNonQuery(); }
三、使用Oracle.ManagedDataAccess.dll(推荐)
1、引用添加:通过NuGet包管理器搜索并安装Oracle.ManagedDataAccess
,然后在项目中添加引用。
2、连接字符串配置:不需要配置TnsNames.Ora文件,连接字符串格式如下:
string connString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=服务器地址)(PORT=端口号)))(CONNECT_DATA=(SERVICE_NAME=服务名)));User Id=用户名;Password=密码";
3、数据库操作示例:与Oracle.DataAccess.Client
的操作方式基本相同,只是在创建OracleConnection
对象时使用new OracleConnection(connString)
即可。
1、异常处理:在进行数据库操作时,务必添加适当的异常处理代码,以捕获和处理可能出现的异常,如连接失败、SQL语法错误等。
try { // 数据库操作代码 } catch (Exception ex) { // 记录异常信息或进行其他处理 Console.WriteLine(ex.Message); }
2、资源释放:确保在使用完数据库连接、命令对象和数据读取器后,及时关闭它们以释放资源,可以使用using
语句自动管理资源的释放,如上述示例中的用法。
3、安全性考虑:避免在代码中硬编码用户名和密码等敏感信息,建议使用加密的方式存储和读取这些信息,或者通过安全的配置文件或环境变量来获取。
4、性能优化:对于频繁执行的数据库操作,可以考虑使用连接池来提高性能。Oracle.ManagedDataAccess.dll
默认启用了连接池,可以通过配置连接字符串中的Pooling
属性来进一步优化连接池的行为。Pooling=true;Min Pool Size=10;Max Pool Size=100;Connection Lifetime=60;Incr Pool Size=5
。
5、事务处理:如果需要进行多个相关的数据库操作,并且希望这些操作要么全部成功要么全部失败,可以使用事务来保证数据的一致性。
using (OracleConnection conn = new OracleConnection(connString)) { conn.Open(); using (OracleTransaction trans = conn.BeginTransaction()) { try { // 执行多个数据库操作 // ... trans.Commit(); } catch (Exception ex) { trans.Rollback(); // 处理异常 } } }
6、参数化查询:为了防止SQL注入攻击,建议使用参数化查询而不是直接拼接SQL字符串,在Oracle.ManagedDataAccess.dll
和Oracle.DataAccess.Client
中,都可以通过为OracleCommand
对象添加Parameters
来实现参数化查询,如上述示例中所示。
7、数据类型映射:注意C#中的数据类型与Oracle数据库中的数据类型之间的映射关系,以确保数据的正确读写,Oracle中的NUMBER
类型可以映射到C#中的int
、decimal
、double
等类型,VARCHAR2
类型可以映射到C#中的string
类型等,但在处理一些特殊数据类型(如CLOB、BLOB等)时,可能需要额外的处理代码来正确地读取和写入数据。
8、版本兼容性:确保所使用的Oracle.ManagedDataAccess.dll
或Oracle.DataAccess.Client
的版本与Oracle数据库服务器的版本兼容,以避免出现兼容性问题,较新的客户端库版本能够更好地支持较新的数据库功能和特性,也要注意不同版本的库可能在API上有一些差异,需要根据具体的文档进行调整。