读书人

小弟我写了一个简单的ado.net执行orac

发布时间: 2012-05-21 18:04:41 作者: rapoo

我写了一个简单的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;        }    }//后面其他方法省略。。。 


[解决办法]

探讨
OracleConnection
建议换一种写法 因为快过时了

[解决办法]
探讨
OracleConnection
建议换一种写法 因为快过时了

[解决办法]
代码没问题,也许可以简练一下:

C# code
   if (parameters == null)   {     throw new ArgumentNullException();   }   using (OracleConnection cn = new OracleConnection(connectionString))   {     OracleCommand cm = cn.CreateCommand();     cm.CommandText = sql;     cm.Parameters.Add(parameters.ToArray());     cm.ExecuteNonQuery();   }
[解决办法]
个人觉得没有问题,这种写法应该是需要3.5以上的框架才能支持吧
[解决办法]
如果LZ觉得不托底,可以下载一个动软代码生成器的软件

安装后在这个路径下
Maticsoft\Codematic2\Template\CodematicDemoS3p\DBUtility
DbHelperOra.cs

这个类是天平哥编写的,可以了解下。
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Data;
using System.Data.OracleClient;
using System.Configuration;

namespace Maticsoft.DBUtility
{
/// <summary>
/// Copyright (C) Maticsoft
/// 数据访问基础类(基于Oracle)
/// 可以用户可以修改满足自己项目的需要。
/// </summary>
public abstract class DbHelperOra
{
//数据库连接字符串(web.config来配置),可以动态更改connectionString支持多数据库.
public static string connectionString = PubConstant.ConnectionString;
public DbHelperOra()
{
}

#region 公用方法

public static int GetMaxID(string FieldName, string TableName)
{
string strsql = "select max(" + FieldName + ")+1 from " + TableName;
object obj = GetSingle(strsql);
if (obj == null)
{
return 1;
}
else
{
return int.Parse(obj.ToString());
}
}
public static bool Exists(string strSql)
{
object obj = GetSingle(strSql);
int cmdresult;
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
{
cmdresult = 0;
}
else
{
cmdresult = int.Parse(obj.ToString());
}
if (cmdresult == 0)
{
return false;
}
else
{
return true;
}
}

public static bool Exists(string strSql, params OracleParameter[] cmdParms)
{
object obj = GetSingle(strSql, cmdParms);
int cmdresult;
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
{
cmdresult = 0;
}
else
{
cmdresult = int.Parse(obj.ToString());
}
if (cmdresult == 0)
{
return false;
}
else
{
return true;
}
}


#endregion
[解决办法]
探讨
代码没问题,也许可以简练一下:


C# code

if (parameters == null)
{
throw new ArgumentNullException();
}
using (OracleConnection cn = new OracleConnection(connectionString))


{
Ora……


[解决办法]
连接sqlserver怎么写,连接oracle就怎么写,只是把“sql”这几个字母换成OleDb
[解决办法]
强烈建议使用using啊...

读书人网 >asp.net

热点推荐