用C#写一个SqlHelper类,方便每次复制一下。
/// <summary>
/// 数据库操作类
/// </summary>
public static class SqlHelper
{
/// <summary>
/// 数据库连接字符串
/// </summary>
private static string conntStr = ConfigurationManager.ConnectionStrings["InfirmaryConnectionStr"].ToString();
#region 异步执行数据库语句
/// <summary>
/// 无参异步执行语句
/// </summary>
/// <param name="sql">Sql语句</param>
/// <returns>受影响的行数</returns>
public static async Task<int> ExecuteNonQueryAsync(string sql)
{
SqlConnection conn = new SqlConnection(conntStr);
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
conn.Open(); // 打开数据库
cmd.Transaction = conn.BeginTransaction(); // 开启事务
int result = await cmd.ExecuteNonQueryAsync();
cmd.Transaction.Commit(); // 提交事务
return result;
}
catch (Exception ex)
{
if (cmd.Transaction != null)
{
cmd.Transaction.Rollback();
}
throw ex;
}
finally
{
if (cmd.Transaction != null)
{
cmd.Transaction.Dispose();
}
conn.Close();
}
}
/// <summary>
/// 带参异步执行语句
/// </summary>
/// <param name="sql">Sql语句</param>
/// <param name="parameters">参数</param>
/// <returns>受影响的行数</returns>
public static async Task<int> ExecuteNonQueryAsync(string sql, SqlParameter[] parameters)
{
SqlConnection conn = new SqlConnection(conntStr);
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
cmd.Parameters.AddRange(parameters); // 添加参数
conn.Open(); // 打开数据库
cmd.Transaction = conn.BeginTransaction(); // 开启事务
int result = await cmd.ExecuteNonQueryAsync();
cmd.Transaction.Commit(); // 提交事务
return result;
}
catch (Exception ex)
{
if (cmd.Transaction != null)
{
cmd.Transaction.Rollback(); // 回滚事务
}
throw ex;
}
finally
{
if (cmd.Transaction != null)
{
cmd.Transaction.Dispose();
}
conn.Close(); // 关闭数据库
}
}
/// <summary>
/// 无参异步执行语句
/// </summary>
/// <param name="sql">Sql语句</param>
/// <returns>返回DataTable</returns>
public static async Task<DataTable> Query(string sql)
{
SqlConnection conn = new SqlConnection(conntStr);
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
conn.Open(); // 打开数据库
cmd.Transaction = conn.BeginTransaction(); // 打开事务
SqlDataReader sdr = await cmd.ExecuteReaderAsync();
DataTable result = ConvertDataReaderToDataTable(sdr);
cmd.Transaction.Commit(); // 提交事务
return result;
}
catch (Exception ex)
{
if (cmd.Transaction != null)
{
cmd.Transaction.Rollback();
}
throw ex;
}
finally
{
if (cmd.Transaction != null)
{
cmd.Transaction.Dispose();
}
conn.Close(); // 关闭数据库
}
}
/// <summary>
/// 无参异步执行语句
/// </summary>
/// <param name="sql">Sql语句</param>
/// <param name="parameters">参数</param>
/// <returns>返回DataTable</returns>
public static async Task<DataTable> Query(string sql, SqlParameter[] parameters)
{
SqlConnection conn = new SqlConnection(conntStr);
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
cmd.Parameters.AddRange(parameters); // 添加参数
conn.Open(); // 打开数据库
cmd.Transaction = conn.BeginTransaction(); // 打开事务
SqlDataReader sdr = await cmd.ExecuteReaderAsync();
DataTable result = ConvertDataReaderToDataTable(sdr);
cmd.Transaction.Commit(); // 提交事务
return result;
}
catch (Exception ex)
{
if (cmd.Transaction != null)
{
cmd.Transaction.Rollback();
}
throw ex;
}
finally
{
if (cmd.Transaction != null)
{
cmd.Transaction.Dispose();
}
conn.Close(); // 关闭数据库
}
}
#endregion
#region 附属方法
/// <summary>
/// 将SqlDataReader转换成DataTable
/// </summary>
/// <param name="reader"></param>
/// <returns></returns>
private static DataTable ConvertDataReaderToDataTable(SqlDataReader reader)
{
try
{
DataTable objDataTable = new DataTable();
int intFieldCount = reader.FieldCount;
for (int intCounter = 0; intCounter < intFieldCount; ++intCounter)
{
objDataTable.Columns.Add(reader.GetName(intCounter), reader.GetFieldType(intCounter));
}
objDataTable.BeginLoadData();
object[] objValues = new object[intFieldCount];
while (reader.Read())
{
reader.GetValues(objValues);
objDataTable.LoadDataRow(objValues, true);
}
reader.Close();
objDataTable.EndLoadData();
return objDataTable;
}
catch (Exception ex)
{
throw new Exception("转换出错!", ex);
}
}
#endregion
}