重构异步执行方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | 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); } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix