C# SQL Server的封装(SQLDataAdapter等)之二(共二)
2017-08-05 22:14
483 查看
本文章仅是本人学习后总结,如有错误之处,请大家指正。 既然你看到这篇文章,说明最少懂,如果看完了还不懂。。。。。你怎么不上天呢。。。 以下Demo均以SQL Server为例说明。 七个DEMO分别说明以下情况 1.connection字符串 2.Command的常用的三个方法。 3.SqlDataApater的Fill方法。 4.SqlDataAdapter的Update和SqlDataBuilder之间的协作。 5.如何执行存储。 6.如何执行事务。 7.简单的扩展,针对三层架构,表对应类,封装快速获取数据。
Demo4:
说明:SqlDataAdapter的Update和SqlDataBuilder
第一个方法:说明AcceptChanges和GetChanges()
第二个方法:说明Update()
必须理解的内容:
1.当FIll调用后DataTable中的Row的RowState均为Unchanged。
2.对行进行修改后,会改变RowState,具体RowState的请看枚举(enum)DataRowState。
3.当需要将内存数据库更新到本地数据库中,需要判断是否有RowState进行了改变,调用GetChanges()进行判断。
4.当调用完GetChanges()后,为了保持数据库一致需要进行
需要懂的DataRow中的RowState和Delete()方法,因为AcceptChanges()。
5.如果不进行调用,那么不能在进行SqlDataAdapt的Udpate操作。
//使用SqlDataAdapter的Update进行数据更新 //内存数据库操作完成后,对应的RowState都会进行变化 //此处的dTable参数就是你操作完后的,也就是Fill获取后操作完的 public static bool SQLAdapterUpdate(string comStr, DataTable dTable) { //记住comStr最好与获取数据Fill使用的字符串一致,且必须有SQL语句中必须有主键!!! using (SqlDataAdapter adapter = new SqlDataAdapter(comStr, SQLHelper.ConStr)) { using (SqlCommandBuilder builder = new SqlCommandBuilder(adapter)) { try { int updateRows=adapter.Update(dTable); if (updateRows == 0) return false; else return true; } catch (Exception ex) { adapter.SelectCommand.Connection.Close(); throw ex; } } } }
Demo5:
说明:如何执行存储过程,且可能存在带出(output)参数。
//怎么带出?!创建SqlParameter[]的时候,进行指定方法output即可 //说实话。。。使用Adapter没有执行过存储过程,都是使用connection后创建Command,但个人认为应该是一样的 public static DataSet SQLProcedure(string tranName, params SqlParameter[] paramters) { DataSet dSet = new DataSet(); using (SqlDataAdapter adapter = new SqlDataAdapter(tranName, SQLHelper.ConStr)) { try { if (paramters != null) { adapter.SelectCommand.Parameters.AddRange(paramters); } //加这么一句即可 adapter.SelectCommand.CommandType = CommandType.StoredProcedure; adapter.Fill(dSet); return dSet; } catch (Exception ex) { adapter.SelectCommand.Connection.Close(); throw ex; } } }
Demo6:
说明:执行事务
public static bool SQLTransaction(List<string> commandStrList) { using (SqlConnection connection = new SqlConnection(SQLHelper.ConStr)) { using (SqlCommand command = connection.CreateCommand()) { try { //必须先将连接打开 connection.Open(); SqlTransaction tran=connection.BeginTransaction(); command.Transaction = tran; for (int i = 0; i < commandStrList.Count; i++) { command.CommandText = commandStrList[i]; command.ExecuteNonQuery(); } //提交事务 tran.Commit(); return true; } catch (Exception ex) { //进行回滚。 command.Transaction.Rollback(); //异常后进行连接的关闭 connection.Close(); throw ex; } } } }
Demo7:
说明:简单扩展
//封装DataReader,返回指定类型的list集合, //主要是想说明DataReader的一些参数和方法 //当数据库一个表对应一个的类,一般用于三层架构情况 public static List<T> SQLDataReaderGetList<T>(string comStr, params SqlParameter[] paramters)where T:class,new() { using (SqlConnection connection = new SqlConnection(SQLHelper.ConStr)) { using (SqlCommand command = connection.CreateCommand()) { try { command.CommandText = comStr; if (paramters != null) { command.Parameters.AddRange(paramters); } //必须先将连接打开 connection.Open(); //CommandBehavior.CloseConnection //在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。 using (SqlDataReader reader = command.ExecuteReader()) { List<T> list = new List<T>(); //判断SqlDataReader是否成功读取了数据 if (reader.HasRows) { //使用反射,获取指定类的属性 PropertyInfo[] propertyCollection=typeof(T).GetProperties(); //当SqlDataReader读取到数据后,SqlDataReader执行返回的数据集(也就是查询结构)的第一行之前 //必须先进行调用Read后,指向第一行,每次调用,指向下一行 while (reader.Read()) { T model = new T(); // reader.FieldCount 字段数 //进行循环遍历对T类型对象的属性赋值 for (int i = 0; i < reader.FieldCount; i++) { //获取指定列的名称 string fieldName = reader.GetName(i); for (int j = 0; j < propertyCollection.Length; j++) { //判断是否相等 if (fieldName == propertyCollection[j].Name) { propertyCollection[j].SetValue(model, reader[i], null); } } } list.Add(model); } } return new List<T>(); } } catch (Exception ex) { //异常后进行连接的关闭 connection.Close(); throw ex; } } } }
以上没有进行详细测试,只是正常生成,自己学习时,请多测试,练习。
相关文章推荐
- C# SQL Server的封装(SQLDataAdapter等)之一(共二)
- C# SqlDataAdapter的学习
- C#中SqlDataAdapter的使用小结
- C#使用SqlDataAdapter.Update更新数据库
- 数据库操作封装--SqlDataAdapter.fill
- 在C#使用SqlDataAdapter的Update更新数据
- C# SqlDataAdapter的学习
- C#里ADO.NET的SqlDataAdapter新增数据
- C#中ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter应该怎么用?
- c#中SqlHelper封装SqlDataReader的方法
- 学习SqlDataAdapter——【之二】
- C#中ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter应该怎么用?
- 如何在 Visual C# .NET 中使用 SqlDataAdapter 对象更新 SQL Server 数据库
- C# 解决SqlDataAdapter fill 已添加项问题
- C#里sqlDataAdapter.fill(DataSet,String)的用法
- c# sqladapter 与sqldataReader
- c# sqladapter 与sqldataReader
- C# DataSet And SqlDataAdapter读取SQL server2008数据库数据
- C#实现SQL全库检索数据-比较使用DataReader与DataAdapter+Datatable效率,差距惊人!
- C#使用SqlDataAdapter的Update方法更新数据