zoukankan      html  css  js  c++  java
  • 使用C#进行数据库增删改查ADO.NET(二)

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

        

     事务:

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

    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线程中进行耗时操作时我们需要将这种操作放在后台,下面以查询操作为例做一下异步版本的演示:

    /// <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("未查询到数据");
        }
    });

       执行结果如下:

       

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

       个人公众号,热爱分享,知识无价。

  • 相关阅读:
    [调参]batch_size的选择
    [调参]CV炼丹技巧/经验
    [Pytorch]Pytorch加载预训练模型(转)
    [PyTorch]论文pytorch复现中遇到的BUG
    [Opencv]图像的梯度与边缘检测(转)
    freemodbus移植、实例及其测试方法
    eclipse的C/C++开发搭建
    ROS安装
    U-boot移植
    QT开发实战一:图片显示
  • 原文地址:https://www.cnblogs.com/charlesmvp/p/13884950.html
Copyright © 2011-2022 走看看