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