/// <summary> /// 执行SQL语句或存储过程,返回影响行数 /// </summary> /// <param name="sql">参数化的SQL语句或存储过程</param> /// <param name="param">参数</param> /// <param name="timeout">超时时间,单位为秒</param> /// <param name="transaction">事务</param> /// <param name="commandType">命令类型</param> /// <returns>影响行数</returns> public int Execute(string sql, Parameters param, int?timeout = null, CommandType?commandType = null) { if (string.IsNullOrWhiteSpace(sql)) { throw new ArgumentException("sql should not be null", "sql"); } using (var watch = new ElapsedWatch("Execute")) using (var conn = GetConnection()) { conn.Open(); return(conn.Execute(sql, param?.Result, conn.Transaction, GetTimeout(timeout), commandType)); } }
/// <summary> /// 查询并返回实体集合 /// </summary> /// <typeparam name="T">实体类型</typeparam> /// <param name="sql">参数化的SQL语句或存储过程</param> /// <param name="param">参数</param> /// <param name="timeout">超时时间,单位为秒</param> /// <param name="commandType">命令类型</param> /// <param name="buffered">是否缓存</param> /// <returns>实体集合</returns> public T[] Query <T>(string sql, Func <Parameters, Parameters> param = null, int?timeout = null, CommandType?commandType = null, bool buffered = true) { if (string.IsNullOrWhiteSpace(sql)) { throw new ArgumentException("sql should not be null", "sql"); } using (var watch = new ElapsedWatch("Query")) using (var conn = GetConnection()) { conn.Open(); return(conn.Query <T>(sql, param.ToDapperParameters(), conn.Transaction, buffered, GetTimeout(timeout), commandType).ToArray()); } }
/// <summary> /// 执行SQL语句或存储过程,select单个值返回 /// </summary> /// <param name="sql">参数化的SQL语句或存储过程</param> /// <param name="param">参数</param> /// <param name="timeout">超时时间,单位为秒</param> /// <param name="transaction">事务</param> /// <param name="commandType">命令类型</param> /// <returns>select单个值返回</returns> public T ExecuteScalar <T>(string sql, Parameters param, int?timeout = null, CommandType?commandType = null) { if (string.IsNullOrWhiteSpace(sql)) { throw new ArgumentException("sql should not be null", "sql"); } using (var watch = new ElapsedWatch("ExecuteScalar")) using (var conn = GetConnection()) { conn.Open(); var o = conn.ExecuteScalar(sql, param?.Result, conn.Transaction, GetTimeout(timeout), commandType); return(o == null || o == DBNull.Value ? default(T) : (T)o); } }
/// <summary> /// 返回bool结果 /// </summary> /// <param name="sql">参数化的SQL语句或存储过程</param> /// <param name="param">参数</param> /// <param name="timeout">超时时间,单位为秒</param> /// <param name="transaction">事务</param> /// <param name="commandType">命令类型</param> /// <param name="buffered">是否缓存</param> /// <returns>结果</returns> public bool Bool(string sql, Func <Parameters, Parameters> param = null, int?timeout = null, CommandType?commandType = null) { if (string.IsNullOrWhiteSpace(sql)) { throw new ArgumentException("sql should not be null", "sql"); } using (var watch = new ElapsedWatch("ExecuteScalar")) using (var conn = GetConnection()) { conn.Open(); var o = conn.ExecuteScalar(sql, param.ToDapperParameters(), conn.Transaction, GetTimeout(timeout), commandType); return(Convert.ToBoolean(o)); } }
/// <summary> /// 根据列名分割出若干个实体,经convert转换后输出. /// e.g. 列名: "A1,A2,A3,B1,B2,B3,C1,C2"中"A1,A2,A3"对应T1, "B1,B2,B3"对应T2,"C1,C2"对应T3 => splitOn = "B1,C1" /// </summary> /// <param name="convert">根据各类型转换出所需结果</param> /// <param name="splitOn">用以分割的字段名集合,以英文逗号分隔</param> /// <param name="sql">参数化的SQL语句或存储过程</param> /// <param name="param">参数</param> /// <param name="timeout">超时时间,单位为秒</param> /// <param name="transaction">事务</param> /// <param name="commandType">命令类型</param> /// <param name="buffered">是否缓存</param> /// <returns>经convert转换后的结果集</returns> public TResult[] Query <T1, T2, T3, TResult>(Func <T1, T2, T3, TResult> convert, string splitOn, string sql, Func <Parameters, Parameters> param = null, int?timeout = null, CommandType?commandType = null, bool buffered = true) { if (convert == null) { throw new ArgumentNullException("convert"); } if (string.IsNullOrWhiteSpace(splitOn)) { throw new ArgumentException("splitOn"); } if (string.IsNullOrWhiteSpace(sql)) { throw new ArgumentException("sql should not be null", "sql"); } using (var watch = new ElapsedWatch("Query[T1, T2, T3]")) using (var conn = GetConnection()) { conn.Open(); return(conn.Query <T1, T2, T3, TResult>(sql, convert, param.ToDapperParameters(), conn.Transaction, buffered, splitOn, GetTimeout(timeout), commandType).ToArray()); } }
/// <summary> /// 多结果集查询并根据转换器返回结果 /// </summary> /// <typeparam name="T">结果类型</typeparam> /// <param name="convert">转换器, 可从其参数中获取每一结果集</param> /// <param name="sql">参数化的SQL语句或存储过程</param> /// <param name="param">参数</param> /// <param name="timeout">超时时间,单位为秒</param> /// <param name="commandType">命令类型</param> /// <returns>结果</returns> public T QueryMultiple <T>(Func <ResultsReader, T> convert, string sql, Parameters param, int?timeout = null, CommandType?commandType = null) { if (convert == null) { throw new ArgumentNullException("convert"); } if (string.IsNullOrWhiteSpace(sql)) { throw new ArgumentException("sql should not be null", "sql"); } using (var watch = new ElapsedWatch("QueryMultiple")) using (var conn = GetConnection()) { conn.Open(); watch.Next("query..."); using (var m = conn.QueryMultiple(sql, param?.Result, conn.Transaction, GetTimeout(timeout), commandType)) { watch.Next("convert"); return(convert(new ResultsReader(m))); } } }