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