您的位置:首页 > 数据库

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;
}
}
}
}


以上没有进行详细测试,只是正常生成,自己学习时,请多测试,练习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息