一个 Oracle Data Provider For .NET (ODP.NET)调用的实例
2011-04-26 11:57 音乐让我说 阅读(2771) 评论(0) 编辑 收藏 举报在使用 ADO.NET 调用 Oracle 的代码中,除SQL语句和 SQL Server 有一些差异外,主要注意如果要一次执行多条SQL语句,前面要加Begin,最后加End和分号,每条SQL语句间要加分号,麻烦一点。
代码如下:
using System; using System.Collections.Generic; using System.Data; using Oracle.DataAccess.Client; namespace ODPDotNetDemo.DAL { public class ProductService { public static DataTable GetAllEntity() { string safeSql = "select * from \"category\"" ; return new OracleHelper().ExecuteFillToDataTable(safeSql); } public static DataTable GetPartialEntity() { string safeSql = "select * from \"category\" where \"category\"=:category1 or \"category\"=:category2" ; //为什么最后不能加 ; 号呢? OracleParameter[] paramValues = new OracleParameter[] { new OracleParameter( ":category1" , "007" ), new OracleParameter( ":category2" , "319" ) }; return new OracleHelper().ExecuteFillToDataTable(safeSql, paramValues); } public static DataTable GetEntityByPager( int pageNumber, int pageSize) { int beginNumber = (pageNumber - 1) * pageSize + 1; int endNumber = pageNumber * pageSize; string safeSql = "SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM \"category\") A WHERE ROWNUM <= :endNumber) WHERE RN >= :beginNumber" ; OracleParameter[] paramValues = new OracleParameter[] { /* 注意:在ODP.NET的参数化查询中,除非制定 OracleCommand.BindByName = true,否则参数的顺序必须一直。例如 :endNumber 参数一定要再 :beginNumber 之前 */ /* BindByName 的默认值为 false, 表示按位置绑定 */ new OracleParameter( ":endNumber" , endNumber), new OracleParameter( ":beginNumber" , beginNumber) }; return new OracleHelper().ExecuteFillToDataTable(safeSql, paramValues); //string safeSql = "SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM \"category\") A WHERE ROWNUM <= {0}) WHERE RN >= {1}"; //safeSql = string.Format(safeSql, endNumber, beginNumber); //return new OracleHelper().ExecuteFillToDataTable(safeSql); } public static List<ProductCategory> GetAllEntity2() { List<ProductCategory> result = new List<ProductCategory>(); string safeSql = "select * from \"category\"" ; using (OracleDataReader reader = new OracleHelper().ExecuteReader(safeSql)) { while (reader.Read()) { ProductCategory p = new ProductCategory(); p.CategoryId = Convert.ToString(reader[ "category" ]); p.DescI = Convert.ToString(reader[ "desci" ]); p.LongDesc = Convert.ToString(reader[ "longdesc" ]); p.Dept = Convert.ToInt32(reader[ "dept" ]); result.Add(p); } reader.Close(); } return result; } } } |
public class ProductCategory { public string CategoryId { get ; set ; } public string DescI { get ; set ; } public string LongDesc { get ; set ; } public int Dept { get ; set ; } } |
using System; using System.Data; using Oracle.DataAccess.Client; using System.Configuration; namespace ODPDotNetDemo.DAL { /// <summary> /// 数据库通用操作类 /// </summary> public class OracleHelper { private static readonly string connString = ConfigurationManager.ConnectionStrings[ "oracleConnStrings" ].ConnectionString; protected OracleConnection con; //连接对象 public OracleHelper() : this (connString) { } /// <summary> /// 带连接字符串的构造函数 /// </summary> /// <param name="constr"></param> public OracleHelper( string constr) { con = new OracleConnection(constr); } /* 注意:在ODP.NET的参数化查询中,除非制定 OracleCommand.BindByName = true,否则参数的顺序必须一直。例如 :endNumber 参数一定要再 :beginNumber 之前 */ /* BindByName 的默认值为 false, 表示按位置绑定 */ #region 打开数据库连接 /// <summary> /// 打开数据库连接 /// </summary> private void Open() { //打开数据库连接 if (con.State == ConnectionState.Closed || con.State == ConnectionState.Broken) { try { if (con.State == ConnectionState.Broken) { //先关闭,然后打开数据库连接 con.Close(); } //打开数据库连接 con.Open(); } catch (Exception e) { throw e; } } } #endregion #region 关闭数据库连接 /// <summary> /// 关闭数据库连接 /// </summary> private void Close() { //判断连接的状态是否已经打开 if (con.State == ConnectionState.Open || con.State == ConnectionState.Broken) { con.Close(); } } #endregion #region 执行查询语句,返回OracleDataReader ( 注意:调用该方法后,一定要对OracleDataReader进行Close ) /// <summary> /// 执行查询语句,返回 OracleDataReader ( 注意:调用该方法后,一定要对OracleDataReader进行Close ) /// </summary> /// <param name="sql">SQL查询语句</param> /// <returns></returns> public OracleDataReader ExecuteReader( string sql) { return ExecuteReader(sql, null ); } /// <summary> /// 执行查询语句,返回 OracleDataReader ( 注意:调用该方法后,一定要对OracleDataReader进行Close ) /// </summary> /// <param name="sql">SQL查询语句</param> /// <param name="cmdParms">参数</param> /// <returns></returns> public OracleDataReader ExecuteReader( string sql, params OracleParameter[] cmdParms) { OracleCommand cmd = new OracleCommand(); PrepareCommand(cmd, con, null , sql, cmdParms); OracleDataReader myReader = cmd.ExecuteReader(CommandBehavior.CloseConnection); return myReader; } #endregion #region 执行SQL命令语句 /// <summary> /// 执行不带参数的SQL语句 /// </summary> /// <param name="sql">SQL命令语句</param> /// <returns>影响的记录数</returns> public int ExecuteCommand( string sql) { return ExecuteCommand(sql, null ); } /// <summary> /// 执行SQL语句,返回影响的记录数 /// </summary> /// <param name="sql">SQL命令语句</param> /// <param name="cmdParms">参数</param> /// <returns>影响的记录数</returns> public int ExecuteCommand( string sql, params OracleParameter[] cmdParms) { OracleCommand cmd = new OracleCommand(); try { PrepareCommand(cmd, con, null , sql, cmdParms); int rowsAffected = cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); Close(); return rowsAffected; } catch (OracleException e) { throw e; } } #endregion #region 执行SQL查询语句,返回数据到 DataSet 中 /// <summary> /// 执行SQL查询语句,返回数据到 DataSet 中 /// </summary> /// <param name="sql">SQL查询语句</param> /// <returns></returns> public DataSet ExecuteFillToDataSet( string sql) { return ExecuteFillToDataSet(sql, null ); } /// <summary> /// 执行SQL查询语句,返回数据到 DataSet 中 /// </summary> /// <param name="sql">SQL查询语句</param> /// <param name="cmdParms">参数</param> /// <returns></returns> public DataSet ExecuteFillToDataSet( string sql, params OracleParameter[] cmdParms) { Open(); //打开数据连接 OracleCommand cmd = new OracleCommand(); PrepareCommand(cmd, con, null , sql, cmdParms); OracleDataAdapter adapter = new OracleDataAdapter(cmd); DataSet ds = new DataSet(); adapter.Fill(ds); Close(); //关闭数据库连接 return ds; } #endregion #region 执行SQL查询语句,返回数据到 DataTable 中 /// <summary> /// 执行SQL查询语句,返回数据到 DataTable 中 /// </summary> /// <param name="sql">SQL查询语句</param> /// <returns></returns> public DataTable ExecuteFillToDataTable( string sql) { return ExecuteFillToDataSet(sql).Tables[0]; } /// <summary> /// 执行SQL查询语句,返回数据到 DataTable 中 /// </summary> /// <param name="sql">SQL查询语句</param> /// <param name="cmdParms">参数</param> /// <returns></returns> public DataTable ExecuteFillToDataTable( string sql, params OracleParameter[] cmdParms) { return ExecuteFillToDataSet(sql, cmdParms).Tables[0]; } #endregion #region 存储过程操作 /// <summary> /// 执行存储过程,返回 OracleDataReader ( 注意:调用该方法后,一定要对OracleDataReader进行Close ) /// </summary> /// <param name="storedProcName">存储过程名</param> /// <param name="parameters">存储过程参数</param> /// <returns></returns> public OracleDataReader RunProcedureReturnDataReader( string storedProcName, IDataParameter[] parameters) { OracleCommand command = BuildQueryCommand(con, storedProcName, parameters); return command.ExecuteReader(CommandBehavior.CloseConnection); } /// <summary> /// 执行存储过程,返回受影响的行数 /// </summary> /// <param name="storedProcName">存储过程名</param> /// <param name="parameters">存储过程参数</param> /// <returns>受影响的行数</returns> public int RunProcedureReturnRowsAffected( string storedProcName, IDataParameter[] parameters) { OracleCommand command = BuildQueryCommand(con, storedProcName, parameters); int rowsAffected = command.ExecuteNonQuery(); Close(); return rowsAffected; } /// <summary> /// 执行存储过程,返回 DataSet /// </summary> /// <param name="storedProcName">存储过程名</param> /// <param name="parameters">存储过程参数</param> /// <returns></returns> public DataSet RunProcedureReturnDataSet( string storedProcName, IDataParameter[] parameters) { OracleCommand cmd = BuildQueryCommand(con, storedProcName, parameters); OracleDataAdapter adapter = new OracleDataAdapter(cmd); DataSet ds = new DataSet(); adapter.Fill(ds); Close(); //关闭数据库连接 return ds; } /// <summary> /// 执行存储过程,返回 DataTable /// </summary> /// <param name="storedProcName">存储过程名</param> /// <param name="parameters">存储过程参数</param> /// <returns></returns> public DataTable RunProcedureReturnDataTable( string storedProcName, IDataParameter[] parameters) { return RunProcedureReturnDataSet(storedProcName, parameters).Tables[0]; } /// <summary> /// 执行存储过程,返回存储过程的 ReturnValue /// </summary> /// <param name="storedProcName">存储过程名</param> /// <param name="parameters">存储过程参数</param> /// <param name="rowsAffected">影响的行数</param> /// <returns></returns> public int RunProcedure( string storedProcName, IDataParameter[] parameters, out int rowsAffected) { int result; OracleCommand command = BuildIntCommand(con, storedProcName, parameters); rowsAffected = command.ExecuteNonQuery(); result = ( int )command.Parameters[ "ReturnValue" ].Value; Close(); return result; } #endregion #region 私有成员 private void PrepareCommand(OracleCommand cmd, OracleConnection conn, OracleTransaction trans, string cmdText, OracleParameter[] cmdParms) { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandText = cmdText; if (trans != null ) cmd.Transaction = trans; cmd.CommandType = CommandType.Text; //cmdType; if (cmdParms != null ) { foreach (OracleParameter parameter in cmdParms) { if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && parameter.Value == null ) { parameter.Value = DBNull.Value; } cmd.Parameters.Add(parameter); } } } /// <summary> /// 构建 OracleCommand 对象(用来返回一个结果集,而不是一个整数值) /// </summary> /// <param name="conn">数据库连接</param> /// <param name="storedProcName">存储过程名</param> /// <param name="parameters">存储过程参数</param> /// <returns>OracleCommand</returns> private OracleCommand BuildQueryCommand(OracleConnection conn, string storedProcName, IDataParameter[] parameters) { if (conn.State != ConnectionState.Open) conn.Open(); OracleCommand command = new OracleCommand(storedProcName, conn); command.CommandType = CommandType.StoredProcedure; foreach (OracleParameter parameter in parameters) { if (parameter != null ) { // 检查未分配值的输出参数,将其分配以DBNull.Value. if ((parameter.Direction == ParameterDirection.InputOutput || parameter.Direction == ParameterDirection.Input) && (parameter.Value == null )) { parameter.Value = DBNull.Value; } command.Parameters.Add(parameter); } } return command; } /// <summary> /// 创建 OracleCommand 对象实例(用来返回一个整数值) /// </summary> /// <param name="storedProcName">存储过程名</param> /// <param name="parameters">存储过程参数</param> /// <returns>OracleCommand 对象实例</returns> private OracleCommand BuildIntCommand(OracleConnection connection, string storedProcName, IDataParameter[] parameters) { OracleCommand command = BuildQueryCommand(connection, storedProcName, parameters); command.Parameters.Add( new OracleParameter( "ReturnValue" , OracleDbType.Int32, 8, ParameterDirection.ReturnValue, false , 0, 0, string .Empty, DataRowVersion.Default, null )); return command; } #endregion } } |
附件下载:https://files.cnblogs.com/Music/ODPDotNetDemo.rar
谢谢浏览!
作者:音乐让我说(音乐让我说 - 博客园)
出处:http://music.cnblogs.com/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步