|  /// <summary>
 /// 执行SQL并返回数据集
 /// </summary>
 /// <param></param>
 /// <returns></returns>
 public DataSet ExecDataSet(string Sql)
 {
 DataSet ds = new DataSet();
 try
 {
 this.Open();
 cmd.CommandText = Replace(Sql);
 Adapter.SelectCommand = cmd;
 Adapter.Fill(ds);
 }
 catch (Exception ex)
 {
 throw ex;
 }
 finally
 {
 this.Close();
 }
 return ds;
 }
 
 上面的方法大家看了是不是觉得既简单又熟悉,确实是的,但仍然相当以前的xxhelper.cs里是做了简化的,该方法既可以直接执行不带参DML语句,也可以执行带参的,但是该方法的形参却
 只有一个,之前的xxhelper.cs里带参执行的话,形参中大多至少还另外一个形参的,比如SqlPeremeters[]类型或参数集合类型的形参,而且方法体里面大多会循环读取参数,上面的方法里
 却没有,都简化掉了,唯一多了一点的是,所执行的命令语句执行前要做一个特殊字符替换,cmd.CommandText = Replace(Sql),Replace方法主要是替换参数前缀,Replace方法如下:
 
 复制代码 代码如下:  /// <summary>
 /// 替换DML语句里的参数前缀
 /// </summary>
 /// <param></param>
 /// <returns></returns>
 public string Replace(string str)
 {
 return str.Replace("$", retParaformat.Substring(0, 1));
 }
 
 因为不同数据库除了在添加参数时有前缀的区别,再具体执行语句时也有前缀区别嘛,比如SQL SERVER里 SELECT USER_NAME,USER_AGE FROM USERS WHERE USER_ID=@USER_ID,ORACLE里是这样的SELECT USER_NAME,USER_AGE FROM USERS WHERE USER_ID=:USER_ID,在此就需要统一一个前缀规则了,统一这样SELECT USER_NAME,USER_AGE FROM USERS WHERE USER_ID=$USER_ID,在执行前根据不同数据库替换前缀$符号,当然这个约定规则不一定是最完美的,也许还存在一定的问题,写到这我也突然想起来之前我见过别人
 的系统中有的就是变量参数用的这种类似特殊符号,肯定也是为了兼容多数据库所作的处理了,呵呵,具体的调用及测试之后统一说明。还有几个方法也和上面类似,大家都熟悉的。如下(不再做具体解释了):
 
 复制代码 代码如下:  /// <summary>
 /// 执行SQL语句并返回DataReader对象
 /// </summary>
 /// <param></param>
 /// <param></param>
 /// <returns></returns>
 public DbDataReader ExecuteDataReader(DbConnection dbcon,string cmdText)
 {
 try
 {
 if (dbcon.State == ConnectionState.Closed)
 {
 dbcon.Open();
 }
 cmd.CommandText = Replace(cmdText);
 DbDataReader dr = cmd.ExecuteReader();
 cmd.Parameters.Clear();
 cmd.Dispose();
 return dr;
 }
 catch
 {
 dbcon.Close();//发生异常在此处关闭,否则在调用显式处关闭
 return null;
 }
 }
 
 /// <summary>
 /// 判断记录是否存在
 /// </summary>
 /// <param></param>
 /// <returns></returns>
 public bool Exist(string Sql)
 {
 bool exist;
 this.Open();
 cmd.CommandText = Replace(Sql);
 DbDataReader dr = cmd.ExecuteReader();
 if (dr.HasRows)
 {
 exist = true; //记录存在
 }
 else
 {
 exist = false; //记录不存在
 }
 dr.Close();
 this.Close();
 return exist;
 }
 /// <summary>
 /// 执行SQL语句
 /// </summary>
 /// <param></param>
 public void ExecSql(string Sql)
 {
 try
 {
 this.Open();
 cmd.CommandText = Replace(Sql);
 cmd.ExecuteNonQuery();
 cmd.Dispose();
 }
 catch (Exception ex)
 {
 throw ex;
 }
 finally
 {
 this.Close();
 }
 
 }
 /// <summary>
 /// 执行SQL语句,返回一个单值
 /// </summary>
 /// <param></param>
 /// <returns></returns>
 public string ReturnValue(string Sql)
 {
 object returnValue = string.Empty;
 try
 {
 this.Open();
 cmd.CommandText = Replace(Sql);
 returnValue = cmd.ExecuteScalar();
 if (returnValue == null)
 {
 returnValue = string.Empty;
 }
 }
 catch (Exception ex)
 {
 throw ex;
 }
 finally
 {
 this.Close();
 }
 return returnValue.ToString();
 }
 /// <summary>
 /// 执行多条SQL语句并启用数据库事务
 /// </summary>
 /// <param></param>
 public bool ExecSqlTran(List<String> SQLStringList)
 {
 this.Open();
 DbTransaction trans = conn.BeginTransaction();
 cmd.Transaction = trans;
 try
 {
 for (int n = 0; n < SQLStringList.Count; n++)
 {
 cmd.CommandText = Replace(SQLStringList[n]);
 cmd.ExecuteNonQuery();
 }
 trans.Commit();
 return true;
 }
 catch
 {
 trans.Rollback();
 return false;
 }
 finally
 {
 this.Close();
 }
 }
 
 下面说下两个存储过程,存储过程基本上分两种,返回结果集的存储过程和执行业务逻辑不返回结果集但却有返回值(如标志等),对于需要有返回值的存储过程,我个人趋向于用输出
 参数代替返回值,因为都能达到一样的效果目的,而且输出参数可以有多个,也就可以根据需要能有多个所谓的“返回值”,所以我之前的开发中一直是用output参数来代替return参数。
 
 
 复制代码 代码如下: (编辑:南平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |