.net基础---数据库操作

 ADO.NET

ADO.NET是.NET数据库的访问架构,ADO是ActiveX Data Objects的缩写。ADO.NET是数据库应用程序和数据源之间沟通的桥梁,主要提供一个面向对象的数据访问架构,用于快速实现对数据库进行操作(curd)
ADO.NET中的五个主要对象

  • 1、DbConnection:数据库连接对象,主要用于实现程序与数据库之间建立连接。需要注意的是:在开发过程中尽量避免过于频繁的创建/释放connection,因为过多的数据库连接可能会导致数据性能瓶颈。
  • 2、DbCommand:数据库指令对象,主要是对数据库发送相关指令操作数据库中数据。
  • 3、DbDataAdapter:数据适配器,主要是可以实现数据源和dataset/datatable之间的数据传输适配。它可以实现将数据库数据适配到dataset中(通过Fill方法),也可以实现将dataset中的数据变更更新到数据库中(通过Update方法)。
  • 4、DataSet:数据集,数据暂存区,它是支持ADO.NET断开式、分布式数据方案的核心对象,是实现基于非连接的数据查询的核心组件。DataSet可以视为是数据库中的指定数据被复制内存中而创建的小型数据库。DataSet本身只是一个数据暂存区,它没有能力直接与数据库沟通的,它与数据库之间一般是由DbDataAdapter来实现的。
  • 5、DbDataReader:它提供了顺序的,只读的方式读取Command对象获得的数据结果集,DataReader会以独占的方式打开数据库连接。DataReader只执行读操作,并且每次只在内存缓冲区里存储结果集的一条数据,所以使用Datareader对象的效率比较高,如果要查询大量数据,同时不需要修改数据时,DataReader是非常好的选择。

DbHelper

  1    public class MysqlDbHelper  2     {  3         public static string connectionString = "Server=localhost;Port=3306;Database=myDataBase;Uid=myUsername;Pwd=myPassword;";  4         public static MySqlConnection GetConnection()  5         {  6             return new MySqlConnection(connectionString);  7         }  8         9         #region sync 10  11         public static int ExecuteNonQuery(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null) 12         { 13             using (var connection =GetConnection()) 14             using (var command = new MySqlCommand()) 15             { 16                 PrepareCommand(command, connection,cmdText, commandType, null,parameters); 17                 return command.ExecuteNonQuery(); 18             } 19         } 20  21         public object ExecuteScalar(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null) 22         { 23             using (var connection = GetConnection()) 24             using (var command = new MySqlCommand()) 25             { 26                 PrepareCommand(command,connection, cmdText, commandType, null, parameters); 27                 return command.ExecuteScalar(); 28             } 29  30         } 31  32         public DataTable ExecuteDataTable(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null) 33         { 34             DataTable datatable = new DataTable(); 35             using (var connection = GetConnection()) 36             using (var command = new MySqlCommand()) 37             { 38                 PrepareCommand(command,connection, cmdText, commandType, null, parameters); 39                 MySqlDataAdapter adapter = new MySqlDataAdapter(command); 40                 adapter.Fill(datatable); 41                 return datatable; 42  43             } 44         } 45  46         public DataSet ExecuteDataSet(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null) 47         { 48             DataSet dataset = new DataSet(); 49             using (var connection = GetConnection()) 50             using (var command = new MySqlCommand()) 51             { 52                 PrepareCommand(command, connection,cmdText, commandType, null, parameters); 53                 MySqlDataAdapter adapter = new MySqlDataAdapter(command); 54                 adapter.Fill(dataset); 55                 return dataset; 56             } 57         } 58  59         public MySqlDataReader ExecuteReader(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null) 60         { 61             using (var connection = GetConnection()) 62             using (var command = new MySqlCommand()) 63             { 64                 PrepareCommand(command,connection, cmdText, commandType, null, parameters); 65                 return command.ExecuteReader(); 66             } 67         } 68  69         #endregion 70  71         #region async 
 72  73         public async Task<int> ExecuteNonQueryAsync(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null, MySqlTransaction mySqlTransaction = null) 74         { 75             using (var connection = GetConnection()) 76             using (var command = new MySqlCommand()) 77             { 78                 PrepareCommand(command,connection, cmdText, commandType, mySqlTransaction, parameters); 79                 return await command.ExecuteNonQueryAsync(); 80             } 81         } 
 82  83         public async Task<object> ExecuteScalarAsync(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null) 84         { 85             using (var connection = GetConnection()) 86             using (var command = new MySqlCommand()) 87             { 88                 PrepareCommand(command,connection, cmdText, commandType, null, parameters); 89                 return await command.ExecuteScalarAsync(); 90             } 91  92         } 
 93  94         public async Task<DataTable> ExecuteDataTableAsync(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null) 95         { 96             DataTable datatable = new DataTable(); 97             using (var connection = GetConnection()) 98             using (var command = new MySqlCommand()) 99             {100                 PrepareCommand(command, connection, cmdText, commandType, null, parameters);101                 MySqlDataAdapter adapter = new MySqlDataAdapter(command);102                 await adapter.FillAsync(datatable);103                 return datatable;104             }105         } 
106 107         public async Task<DataSet> ExecuteDataSetAsync(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null)108         {109             DataSet dataset = new DataSet();110             using (var connection = GetConnection())111             using (var command = new MySqlCommand())112             {113                 PrepareCommand(command, connection, cmdText, commandType, null, parameters);114                 MySqlDataAdapter adapter = new MySqlDataAdapter(command);115                 await adapter.FillAsync(dataset);116                 return dataset;117             }118         }119         /// <summary>120         /// reader121         /// </summary>122         /// <param name="cmdText"></param>123         /// <param name="commandType"></param>124         /// <param name="parameters"></param>125         /// <returns></returns>126         public static async Task<DbDataReader> ExecuteReaderAsync(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null)127         {128             using (var connection = GetConnection())129             using (var command = new MySqlCommand())130             {131                 PrepareCommand(command,connection, cmdText, commandType, null, parameters);132                 return await command.ExecuteReaderAsync();133             }134         }135 136         #endregion137 138         #region private Method139 140         private static void PrepareCommand(MySqlCommand command,MySqlConnection connection, string commandText, CommandType commandType, MySqlTransaction transaction, Dictionary<string, object> parameters)141         {142             command.CommandText = commandText;143             command.CommandType = commandType;144             if (connection.State != ConnectionState.Open)145             {146                 connection.Open();147             }148             command.Connection = connection;149             if (transaction != null)150             {151                 command.Transaction = transaction;152             }153             AttachParameter(command, parameters);154         }155 156         private static void AttachParameter(MySqlCommand command, Dictionary<string, object> parameters)157         {158             if (parameters != null && parameters.Count > 0)159             {160                 foreach (var parameterItem in parameters)161                 {162                     command.Parameters.Add(new MySqlParameter(parameterItem.Key, parameterItem.Value));163                 }164             }165         }166 167         #endregion168     }

 

以上是简单的数据操作帮助类,对于非常简单的增删改查还是可以应付的(但是对于事务的支持是不够的)。

简单封装Db操作--支持事务

一、 创建Db操作类(不再使用静态的dbHelper)

  1     public class MysqlOperator  2     {  3         private readonly MySqlConnection _mySqlConnection;  4         public MysqlOperator(MySqlConnection mySqlConnection)  5         {  6             this._mySqlConnection = mySqlConnection;  7         }  8         #region sync  9         public int ExecuteNonQuery(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null,MySqlTransaction mySqlTransaction=null) 10         { 11             using (var command = new MySqlCommand()) 12             { 13                 PrepareCommand(command, cmdText, commandType, mySqlTransaction, parameters); 14                 return command.ExecuteNonQuery(); 15             } 16         } 17  18         public object ExecuteScalar(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null) 19         { 20             using (var command = new MySqlCommand()) 21             { 22                 PrepareCommand(command, cmdText, commandType, null, parameters); 23                 return command.ExecuteScalar(); 24             } 25  26         } 27  28         public DataTable ExecuteDataTable(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null) 29         { 30             DataTable datatable = new DataTable(); 31  32             using (var command = new MySqlCommand()) 33             { 34                 PrepareCommand(command, cmdText, commandType, null, parameters); 35                 MySqlDataAdapter adapter = new MySqlDataAdapter(command); 36                 adapter.Fill(datatable); 37                 return datatable; 38  39             } 40         } 41         public DataSet ExecuteDataSet(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null) 42         { 43             DataSet dataset = new DataSet(); 44  45             using (var command = new MySqlCommand()) 46             { 47                 PrepareCommand(command, cmdText, commandType, null, parameters); 48                 MySqlDataAdapter adapter = new MySqlDataAdapter(command); 
 49                 adapter.Fill(dataset); 50                 return dataset; 
 51             } 52         } 53         public MySqlDataReader ExecuteReader(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null) 54         { 55             using (var command = new MySqlCommand()) 56             { 57                 PrepareCommand(command, cmdText, commandType, null, parameters); 58                 return command.ExecuteReader(); 59             } 60         } 61         #endregion 62         #region async 
 63         public async Task<int> ExecuteNonQueryAsync(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null, MySqlTransaction mySqlTransaction = null) 64         { 65             using (var command = new MySqlCommand()) 66             { 67                 PrepareCommand(command, cmdText, commandType, mySqlTransaction, parameters); 68                 return await command.ExecuteNonQueryAsync(); 69             } 70         } 71  72         public async Task<object> ExecuteScalarAsync(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null) 73         { 74             using (var command = new MySqlCommand()) 75             { 76                 PrepareCommand(command, cmdText, commandType, null, parameters); 77                 return await command.ExecuteScalarAsync(); 78             } 79  80         } 81  82         //public async  Task<DataTable> ExecuteDataTableAsync(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null) 83         //{ 84         //    DataTable datatable = new DataTable(); 85  86         //    using (var command = new MySqlCommand()) 87         //    { 88         //        PrepareCommand(command, cmdText, commandType, null, parameters); 89         //        MySqlDataAdapter adapter = new MySqlDataAdapter(command); 90         //        await adapter.FillAsync(datatable); 91         //        return datatable; 
 92         //    } 93         //} 94         //public async Task<DataSet> ExecuteDataSetAsync(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null) 95         //{ 96         //    DataSet dataset = new DataSet(); 97  98         //    using (var command = new MySqlCommand()) 99         //    {100         //        PrepareCommand(command, cmdText, commandType, null, parameters);101         //        MySqlDataAdapter adapter = new MySqlDataAdapter(command);102         //        await  adapter.FillAsync(dataset);103         //        return dataset;104         //    }105         //}106 107 108         /// <summary>109         /// 110         /// </summary>111         /// <param name="cmdText"></param>112         /// <param name="commandType"></param>113         /// <param name="parameters"></param>114         /// <returns></returns>115         public async Task<DbDataReader> ExecuteReaderAsync(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null)116         {117             using (var command = new MySqlCommand())118             {119                 PrepareCommand(command, cmdText, commandType, null, parameters);120                 return await command.ExecuteReaderAsync();121             }122         }123         #endregion124         #region private Method125         private void PrepareCommand(MySqlCommand command, string commandText, CommandType commandType, MySqlTransaction transaction, Dictionary<string, object> parameters)126         {127             command.CommandText = commandText;128             command.CommandType = commandType;129             if (_mySqlConnection.State != ConnectionState.Open)130             {131                 _mySqlConnection.Open();132             }133             command.Connection = _mySqlConnection;134             if (transaction != null)135             {136                 command.Transaction = transaction;137             }138             AttachParameter(command, parameters); 
139         }140         private void AttachParameter(MySqlCommand command, Dictionary<string, object> parameters)141         {142             if (parameters != null && parameters.Count > 0)143             {144                 foreach (var parameterItem in parameters)145                 {146                     command.Parameters.Add(new MySqlParameter(parameterItem.Key, parameterItem.Value));147                 }148             }149         }150         #endregion151     }

 

二、定义数据操作管理类

 1     public class SqlManagement : IDisposable 2     { 3         private readonly IConfiguration _configuration; 4         private readonly MysqlOperator _mysqlOperator; 5         private readonly string _connectionString; 6         public SqlManagement(IConfiguration configuration) 7         { 8             this._configuration = configuration; 9             this._mySqlConnection = new MySqlConnection(_configuration.GetConnectionString("mysqlconnection"));10             this._mysqlOperator = new MysqlOperator(_mySqlConnection);11         }12         private MySqlConnection _mySqlConnection;13         private MySqlTransaction _mySqlTransaction;14         public void BeginTransaction()15         {16             _mySqlTransaction = _mySqlConnection.BeginTransaction();17         }18         public void Commit()19         {20             if (_mySqlTransaction != null)21             {22                 _mySqlTransaction.Commit();23             }24             if (_mySqlConnection != null)25             {26                 _mySqlConnection.Close();27             }28         }29         public void Rollback()30         {31             if (_mySqlTransaction != null)32             {33                 _mySqlTransaction.Rollback();34             }35             if (_mySqlConnection != null)36             {37                 _mySqlConnection.Close();38             }39         }40         public void Dispose()41         {42             if (_mySqlConnection != null)43             {44                 _mySqlConnection.Dispose();45                 _mySqlConnection = null;46             }47         }48 49         #region 50         public int ExecuteNonQuery(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null)51         {52             if (_mySqlTransaction != null)53             {54                 return _mysqlOperator.ExecuteNonQuery(cmdText, commandType, parameters, _mySqlTransaction);55             }56             else57             {58                 return _mysqlOperator.ExecuteNonQuery(cmdText, commandType, parameters);59             }60         }61 62         public object ExecuteScalar(string cmdText, CommandType commandType = CommandType.Text, Dictionary<string, object> parameters = null)63         {64             return _mysqlOperator.ExecuteScalar(cmdText, commandType, parameters);65         }66         #endregion67     }

 

其实已经有很多组件已经实现了很好的数据库操作的封装了,例如Dapper、EF等