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