| 
                           /// <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参数。 
 
 复制代码 代码如下:                         (编辑:泰州站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |