日期:2014-05-17  浏览次数:20597 次

我写了一个简单的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.Com