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; } } } } 以上没有进行详细测试,只是正常生成,自己学习时,请多测试,练习。