C# SQL Server的封装(SQLDataAdapter等)之二(共二)

来源:互联网 发布:淘宝快递模板下载 编辑:程序博客网 时间:2024/06/07 00:57
本文章仅是本人学习后总结,如有错误之处,请大家指正。既然你看到这篇文章,说明最少懂,如果看完了还不懂。。。。。你怎么不上天呢。。。以下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;                    }                }            }        }
以上没有进行详细测试,只是正常生成,自己学习时,请多测试,练习。
原创粉丝点击