一个 Oracle Data Provider For .NET (ODP.NET)调用的实例
2011-04-26 11:57 音乐让我说 阅读(2741) 评论(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/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。