前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用C#进行数据库增删改查(二)

使用C#进行数据库增删改查(二)

作者头像
宿春磊Charles
发布2022-03-29 10:20:35
7580
发布2022-03-29 10:20:35
举报
文章被收录于专栏:DotNet 致知

这节接着讲用C#进行数据库CRUD,高级部分。

事务:

事务是执行一批sql语句,如果中途失败,全部回滚,数据不会受影响,中途没有出错则会提交事务,真正对数据进行修改。C#提供了SqlTransaction类来处理数据库事务,下面通过一个示例方法来看一下这个类如何使用:

代码语言:javascript
复制
using(SqlConnection connection=new SqlConnection(connString)
{
  //开启连接
  connection.Open();
  using (SqlCommand command = connection.CreateCommand ())
  {
    using (SqlTransaction transaction = connection.BeginTransaction ())
    {
      try
      {
          int count = 0;
          //将事务对象绑定到执行对象上
          command.Transaction = transaction;
          if (parameters != null)
              command.Parameters.AddRange (parameters);
          //执行sql,注意:此时数据并未真正修改
          foreach (string sql in sqls)
          {
              command.CommandText = sql;
              count += command.ExecuteNonQuery();
          }
          //执行时不出错就会提交事务,此时数据真正被修改
          transaction.Commit();
          return count;
      }
      catch
      {
          //执行时出错或者中途连接断开都会回滚事务
          transaction.Rollback();
          return 0;
      }
    }
  }
}

使用连接对象创建出执行对象和事务对象,执行完毕没有错误的话,执行事务对象的Commit()方法提交,如果出错执行Rollback()方法回滚。

异步方法:

在我们在执行sql的时候有时希望是异步执行的,为此微软推出了Task类和一批基于Task的异步方法,很典型的就是在老方法后加上Async这个后缀,如:ExecuteNonQuery()的异步版本是ExecuteNonQueryAsync()。尤其是在UI线程中进行耗时操作时我们需要将这种操作放在后台,下面以查询操作为例做一下异步版本的演示:

代码语言:javascript
复制
/// <summary>
/// 执行查询操作(异步泛型版)
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="parameters">参数</param>
/// <returns>数据集合,出错返回null</returns>
public static async Task<List<T>> SelectDBAsync<T> (string sql, SqlParameter[] parameters) where T : new()
{
  if (connection == null)
  {
      Console.WriteLine ("数据库未连接");
      return null;
  }

  using (SqlCommand command = new SqlCommand (sql, connection))
  {
    try
    {
        if (parameters != null)
        {
            command.Parameters.AddRange (parameters);
        }
        //调用异步方法
        SqlDataReader reader = await command.ExecuteReaderAsync ();
        if (reader.HasRows)
        {
            List<T> data = new List<T> ();
            Type type = typeof (T);
            object o = Activator.CreateInstance (type);
            while (reader.Read ())
            {
                foreach (var property in type.GetProperties ())
                {
                    property.SetValue (o, reader[property.Name]);
                }
                data.Add ((T)o);
            }
            reader.Close ();
            return data;
        }

        return null;
    }
    catch
    {
        return null;
    }
  }
}

//在主线程中调用此方法查询数据(数据表跟上一篇文章一样),具体逻辑如下:
SqlParameter[] parameters = new[] { new SqlParameter ("@sname", "李四"), };
Task<List<StudentModel>> studentInfo = ADOUtils.SelectDBAsync<StudentModel> ("select SID,SName,SGender from StudentInfo where SName=@sname ", parameters);
studentInfo.ContinueWith((result) =>
{
    if (studentInfo != null)
        foreach (StudentModel studentModel in result.Result)
        {
            Console.WriteLine(studentModel);
        }
    else
    {
        Console.WriteLine("未查询到数据");
    }
});
//主线程最后要睡一会,防止数据还没输出程序就结束了
Thread.Sleep(5000);

执行结果如下:

有关Task的用法可以参照前文:基于任务的异步编程(Task,async,await)

关于C#操作数据库的文章到此结束,本文所用的代码可以去我的博客园查看:

https://www.cnblogs.com/charlesmvp/p/13884962.html

END...

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet 致知 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档