当前位置: 代码迷 >> ASP.NET >> 小弟我写了一个简单的ado.net执行oracle语句的方法,这样写可以吗,有没有严重的异常
  详细解决方案

小弟我写了一个简单的ado.net执行oracle语句的方法,这样写可以吗,有没有严重的异常

热度:2365   发布时间:2013-02-25 00:00:00.0
我写了一个简单的ado.net执行oracle语句的方法,这样写可以吗,有没有严重的错误
代码如下:这个方法有没有什么重大的严重的错误,如连接不能释放等等之类的

暂时不考虑代码写得好不好
public void ExecSql(string sql, List<OracleParameter> parameters, string connectionString)
  {
  OracleConnection cn = new OracleConnection(connectionString);
  try
  {
  OracleCommand cm = cn.CreateCommand();
  cm.CommandText = sql;
  if (parameters != null && parameters.Count > 0)
  {
  foreach (OracleParameter par in parameters)
  {
  cm.Parameters.Add(par);
  }
  }
  cm.ExecuteNonQuery();
  }
  catch (OracleException e)
  {
  throw e;
  }
  finally
  {
  cn.Close();
  }
  }

------解决方案--------------------------------------------------------
OracleConnection
建议换一种写法 因为快过时了

------解决方案--------------------------------------------------------
举个例子吧
C# code
using System.Data.OleDb;using System.Data.Odbc;using System.Configuration;//方法        public static string GetPK(string TableName)        {            string pk = "";            string sql = "select " + TableName + ".nextval from dual";            OleDbConnection con = new OleDbConnection(MyConnString);            OleDbCommand cmd = new OleDbCommand(sql, con);            con.Open();            OleDbDataReader odr = cmd.ExecuteReader();            if (odr.Read())            {                pk = odr["NEXTVAL"].ToString();            }            con.Close();            return pk;        }
------解决方案--------------------------------------------------------
一个建议是链接对象使用using,用完就释放掉。

另外一个有点搞不清楚,返回void的查询有什么用?专门用于创建表,还是专门用于Update?

还有一个,难道使用的时候每次都要传递connectionString?很不方便哦。
------解决方案--------------------------------------------------------
string connectionString
是用来干嘛的? 
楼主你还是运行下才知道有没有问题啊
------解决方案--------------------------------------------------------
探讨
引用:

一个建议是链接对象使用using,用完就释放掉。

另外一个有点搞不清楚,返回void的查询有什么用?专门用于创建表,还是专门用于Update?

还有一个,难道使用的时候每次都要传递connectionString?很不方便哦。

你没看懂啊,我这个执行sql语句,如insert,update,delete语句, 当然不是查询
我当然还有查询的,查询的……

------解决方案--------------------------------------------------------
贴一个自己封装的 OracleHelper

以楼主的执行增删改为例:
C# code
/// <summary>    /// 数据访问帮助类    /// </summary>    public class DBHelper    {        private OracleConnection _con;        /// <summary>        /// 连接对象字符串        /// </summary>        public OracleConnection con        {            get            {                if (_con == null)                   //从配置文件读取连接字符串                    _con = new OracleConnection("Password=tiger;User ID=scott;Data Source=scce");                return _con;            }        }       /// <summary>        /// 增加、删除、修改 或存储过程        /// </summary>        /// <param name="sql">SQL 语句</param>        /// <param name="type">指定SQL语句类型</param>        /// <param name="lists">存储过程元素数组,最后一个为传出参数</param>        /// <returns>返回结果</returns>        public int ExecuteNonQuery(string sql, CommandType type, params OracleParameter[] lists)        {            //初始化结果            int result = 0;            //创建命令对象            OracleCommand cmd = new OracleCommand();            //指定命令对象的连接池            cmd.Connection = con;            //指定命令对象的SQL语句            cmd.CommandText = sql;            //指定命令对象的类型            cmd.CommandType = type;            //如果是存储过程            if (cmd.CommandType == CommandType.StoredProcedure)            {                //指定最后一个参数为传出参数                lists[lists.Length - 1].Direction = ParameterDirection.Output;                //添加元素进存储过程                cmd.Parameters.AddRange(lists);                //打开连接                con.Open();                //执行操作                cmd.ExecuteNonQuery();                //获取存储过程传出的值                result = (int)lists[lists.Length - 1].Value;                //关闭连接                con.Close();            }            //否则默认执行 SQL 语句            else            {                //打开连接                con.Open();                //获取受影响行数                result = cmd.ExecuteNonQuery();                //关闭连接                con.Close();            }            //返回结果            return result;        }    }//后面其他方法省略。。。
  相关解决方案