C# 异步查询返回DataTable类

本文介绍了作者尝试通过异步方式查询SqlServer数据库并返回DataTable的结果,发现并未显著提升查询速度,强调了在实际应用中结合并发和多线程优化的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想测试一下直连SqlServer数据库异步查询和普通查询效率问题,在网上搜了很多异步查询返回DataTable的帖子发现,都是返回部分数据,所以自己根据测试需求,写了一个异步查询返回DataTable的类。只是简单的直连,方法仅供参考,大牛勿喷。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace WindowsFormsAsyncAwait
{
    internal class DBHelper
    {
        private string connectionString= ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
        public async Task<bool> ExecuteNonQueryAsync(string sqlstr)
        {
            // 创建连接对象并打开连接
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                await connection.OpenAsync();
                // 构造SQL语句
                // 创建命令对象并设置参数值
                using (SqlCommand command = new SqlCommand(sqlstr, connection))
                {
                    try
                    {
                        // 执行查询并返回结果
                        int rowsAffected = await command.ExecuteNonQueryAsync();

                        if (rowsAffected > 0)
                        {
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"Error occurred while inserting data: {ex.Message}");
                        throw;
                    }
                }
            }
        }
        /// <summary>
        /// 普通方式查询
        /// </summary>
        /// <param name="sqlstr">SQL语句</param>
        /// <returns>返回DataTable</returns>
        public DataTable GetAllData(string sqlstr)
        {
            DataSet ds = new DataSet();
            // 连接到数据库或其他存储系统
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                try
                {
                    connection.Open();
                    using (var command = new SqlCommand(sqlstr, connection))
                    {
                        SqlDataAdapter adapter = new SqlDataAdapter(command);
                        adapter.Fill(ds);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Error occurred while querying data: {ex.Message}");
                }
                finally
                {
                    connection.Close();
                }
            }
            return ds.Tables[0];
        }
        /// <summary>
        /// 异步查询返回数据
        /// </summary>
        /// <param name="sqlstr">SQL语句</param>
        /// <returns>返回DataTable</returns>
        public async Task<DataTable> GetAllDataAsync(string sqlstr)
        {
            DataTable result = new DataTable();
            // 连接到数据库或其他存储系统
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                try
                {
                    await connection.OpenAsync();
                    using (var command = new SqlCommand(sqlstr, connection))
                    {
                        //第一种方法
                        using (var reader = await command.ExecuteReaderAsync())
                        {
                            for (int i = 0; i < reader.FieldCount; i++)
                            {
                                result.Columns.Add(reader.GetName(i), typeof(object));
                            }
                            while (await reader.ReadAsync())
                            {
                                object[] rowValues = new object[reader.FieldCount];
                                for (int i = 0; i < reader.FieldCount; i++)
                                {
                                    rowValues[i] = reader.IsDBNull(i) ? DBNull.Value : reader.GetValue(i);
                                }

                                result.Rows.Add(rowValues);
                            }
                        }


                        //第二种方法
                        //using (var reader = await command.ExecuteReaderAsync())
                        //{
                        //    //组织数据集列
                        //    for (int i = 0; i < reader.FieldCount; i++)
                        //    {
                        //        result.Columns.Add(reader.GetName(i), reader.GetFieldType(i));
                        //    }
                        //    //循环写入数据
                        //    while (await reader.ReadAsync())
                        //    {
                        //        DataRow row = result.NewRow();
                        //        for (int i = 0; i < reader.FieldCount; i++)
                        //        {
                        //            row[reader.GetName(i)] = reader[reader.GetName(i)];
                        //        }
                        //        result.Rows.Add(row);
                        //    }
                        //}
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Error occurred while querying data: {ex.Message}");
                }
                finally
                {
                    connection.Close();
                }
            }
            return result;
        }
    }
}
 

测试了一下,发现异步操作并没有实质上提高查询数据库的速度,只是发挥了并行的长处。所以需要根据自己实际情况,结合并发、多线程等做处理才能达到预期目的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值