重构异步执行方法

本文介绍了一个用于操作 Teradata 数据库的静态辅助类 TeraDataHelper 的实现。该类提供了一系列方法,如 GetRows 和 GetTable 方法用于执行 SQL 查询并获取结果;ExecuteDataReader 和 ExecuteDataReaderAsync 方法用于执行读取器并处理结果。此外,还定义了从 TdDataReader 对象中选择数据的方法。
 public static class TeraDataHelper
    {

		//<add key="CommandTimeout" value="200000" />
		//<add key="Teradata_Connect_String" value="Data Source = 172.20.70.73;User ID = pu_dw_user_web;Password = pu_dw_user_web;"/>

        public static string TDConnstring = ConfigurationManager.ConnectionStrings["Teradata_Connect_String"].ConnectionString;
        public static int CommandTimeout = int.Parse(ConfigurationManager.AppSettings["CommandTimeout"]);

        /// <summary>
        /// TD中查询sql
        /// </summary>
        /// <param name="sqlstr">sql语句</param>
        /// <returns>返回DataRow</returns>
        public static DataSet GetRows(string sqlString)
        {
            DataSet ds = new DataSet();
            try
            {
                TdDataAdapter adapter = new TdDataAdapter(sqlString, TDConnstring);
                adapter.Fill(ds);
            }
            catch (Exception ex)
            {
                //log.writeLog("执行sql 报错,报错信息为:" + ex.Message + ", 报错语句为:‘" + sqlString + "’", "失败");
                //MessageBox.Show(ex.Message);
                //throw;
            }
            return ds;
        }

        /// <summary>

        /// 获取TD的数据

        /// </summary>

        /// <param name="sqlstr">sql语句:查询语句</param>

        /// <returns>返回数据表 DataTable</returns>
        public static DataTable GetTable(string sqlStr)
        {
            TdConnection con = new TdConnection();
            DataTable dataTable = new DataTable();
            con.ConnectionString = TDConnstring;
            try
            {
                TdCommand cmd = con.CreateCommand();
                cmd.CommandTimeout = CommandTimeout;
                cmd.CommandText = sqlStr;

                // Create the TdDataAdapter object. It retrieves the data from database and fill a single data table 
                // with in a dataset. It also capable of reconciling the changes to database.                    
                TdDataAdapter adapter = new TdDataAdapter();
                adapter.ReturnProviderSpecificTypes = true;
                adapter.SelectCommand = cmd;


                // Create a DataTable object and it represents one table of in-memory data.               

                adapter.ReturnProviderSpecificTypes = true;
                adapter.Fill(dataTable);
                return dataTable;
            }
            catch (Exception ex)
            {
                //log.writeLog("执行sql 报错,报错信息为:" + ex.Message + ", 报错语句为:‘" + sqlStr + "’", "失败");
                //MessageBox.Show(ex.Message);
                throw;
            }
            finally
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
            
        }
        public static void ExecuteDataReader(string sql, Action<TdDataReader> action)
        {
            using (var connection = new TdConnection(TDConnstring))
            {
                connection.Open();
                using (var cmd = connection.CreateCommand())
                {
                    cmd.CommandText = sql;
                    using (var dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                                action.Invoke(dr);
                    }
                }
            }
        }
        public static async void ExecuteDataReaderAsync(string sql, Action<TdDataReader> action)
        {
            using (var connection = new TdConnection(TDConnstring))
            {
                await connection.OpenAsync();
                using (var cmd = connection.CreateCommand())
                {
                    cmd.CommandText = sql;
                    var dr = await cmd.ExecuteReaderAsync( CommandBehavior.CloseConnection);
                   
                        while (await dr.ReadAsync())
                            action.Invoke(dr);
                   
                }
            }
        }
       
        public static IEnumerable<T> ExecuteDataReader<T>(string sql,  Func<TdDataReader, T> action)
        {
            using (var connection = new TdConnection(TDConnstring))
            {
                connection.Open();
                using (var cmd = connection.CreateCommand())
                {
                    cmd.CommandText = sql;
                   using (var dr = cmd.ExecuteReader())
                    {
                        while (dr.Read())
                            yield return action.Invoke(dr);
                    }
                }
            }
        }

        public static async Task<IEnumerable<T>> ExecuteDataReaderAsync<T>(string sql, Func<TdDataReader, T> action)
        {
            using (var connection = new TdConnection(TDConnstring))
            {
                await connection.OpenAsync();
                using (var cmd = connection.CreateCommand())
                {
                    cmd.CommandText = sql;
                    using (var dr = await cmd.ExecuteReaderAsync())
                    {
                       return dr.Select(r => action(r)).ToList();
                    }
                }
            }
        }
       


    }
    public static class Extensions
    {

        public static IEnumerable<T> Select<T>(
            this TdDataReader reader, Func<TdDataReader, T> action)
        {

            while (reader.Read())
            {
                yield return action(reader);
            }
        }
    }

  

转载于:https://www.cnblogs.com/neozhu/p/9046819.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值