思路
- 获得数据库连接
- 管理数据库连接
- 执行SQL语句
- 对结果集进行处理
下面进行详细的讲解
1.获得数据库连接
在配置文件中加入数据库连接语句。
好处是以后你可以方便的修改数据库连接而不需要修改之后再次编译。<connectionStrings> <add name="DB" connectionString= "metadata=res://*/DBC.DB.csdl|res://*/DBC.DB.ssdl|res://*/DBC.DB.msl; provider=System.Data.SqlClient; provider connection string=" data source=.; initial catalog=ICD10BADATA_2013; user id=sa; password=789&*(abc; multipleactiveresultsets=True; application name=EntityFramework"" providerName="System.Data.EntityClient" /> </connectionStrings>
获得数据库连接语句是怎么获得的呢?
conn.ConnectionString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
2.管理数据库连接
使用using可以在逻辑跳出using代码块后立即释放using()括号中的资源
conn为数据库连接类SqlConnection 在using内部你还可手动的关闭资源using (conn = new SqlConnection()) { conn.Open(); conn.Close(); }
3.执行SQL语句
分析sql语句
- 返回结果集
com.ExecuteNonQuery(); com.ExecuteScalar();
- 返回一个值
com.ExecuteReader();
- 执行存储过程
无非就是这几种,此处我并没有封装存储过程执行,只考虑了前面两个情况
4. 对结果集进行处理
这里需要用到反射 而C#的反射非常友好 所有不要被吓到
反射就是 根据对象得到类的信息 你可以这样简单的理解需要注意的是泛型的实例化是这样的
T t = Activator.CreateInstance<T>();
foreach (PropertyInfo param in t.GetType().GetProperties()) {
所以这里就是根据泛型的对象 t 得到T类的属性名 你想啊
1.如果这属性名和数据库的表列名对应
2.你有一个可以给对象 t 属性赋值的方法 param.SetValue(t,valueStr, null);
那这个时候是不是就可以做点大事?
对了就是自动映射结果集到泛型集合 你可以参考这段代码public List<T> SqlQuery<T>(String sqlStr) { Trace.WriteLine(Tag + "SqlQuery传入sql语句>>>" + sqlStr); if (sqlStr.Trim().Equals("") || sqlStr is null) { throw new Exception("SqlQuery传入参数不能为空"); } using (conn = new SqlConnection()) { conn.ConnectionString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; conn.Open(); com.Connection = conn; com.CommandText = sqlStr; //查询结果临时阅读器,连接关闭之后清空缓存 SqlDataReader reader = null; //泛型结果集容器 List<T> res = new List<T>(); try { reader = com.ExecuteReader();//执行,返回结果集 //给结果集容器赋值 while (reader.Read()) { T t = Activator.CreateInstance<T>(); foreach (PropertyInfo param in t.GetType().GetProperties()) { //Entity实体名称可以大小写,查询结果集必须全部小写 int index = reader.GetOrdinal(param.Name.ToLower()); var tempVar = reader[index]; String tempStr = ""; tempStr = tempVar.ToString().Trim(); param.SetValue(t, tempStr, null); } res.Add(t); } } catch (Exception e) { Trace.WriteLine(Tag + "SqlQuery异常>>>" + e.ToString()); //进行比较牛逼的操作.remark } finally { reader.Close(); conn.Close(); } return res; } }
我试着封装的SQL女仆 互相学习 加油
public class SQLMaid
{
private String Tag = "SqlMaid日志>>>>>>>>>>>>>>>>>";
private SqlConnection conn;
private SqlCommand com = new SqlCommand();
/// <summary>
/// 执行语句返回受影响行数 或者 返回单个值
/// </summary>
/// <param name="sqlStr">sql语句</param>
/// <returns>受影响行数/单个值</returns>
public Object SqlExec(String sqlStr)
{
Trace.WriteLine(Tag + "SqlExec传入sql语句>>>" + sqlStr);
if (sqlStr.Trim().Equals("") || sqlStr is null)
{
throw new Exception("SqlExec传入参数不能为空");
}
using (conn = new SqlConnection())
{
conn.ConnectionString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
conn.Open();
com.Connection = conn;
com.CommandText = sqlStr;
SqlTransaction trans = conn.BeginTransaction();
Object res = null;
try
{
//判断对方即将进行的操作
if (sqlStr.ToLower().IndexOf("select") == -1)//不是执行查询
{
res = com.ExecuteNonQuery();//返回行数
}
else
{
res = com.ExecuteScalar();//返回第一行第一列
}
trans.Commit();
}
catch (Exception e)
{
Trace.WriteLine(Tag + "SqlExec异常>>>" + e.ToString());
trans.Rollback();
}
finally
{
conn.Close();
}
return res;
}
}
/// <summary>
/// 查询结果集 返回list
/// </summary>
/// <typeparam name="T">结果集Entity类</typeparam>
/// <param name="sqlStr">sql语句</param>
/// <returns>结果集List</returns>
public List<T> SqlQuery<T>(String sqlStr)
{
Trace.WriteLine(Tag + "SqlQuery传入sql语句>>>" + sqlStr);
if (sqlStr.Trim().Equals("") || sqlStr is null)
{
throw new Exception("SqlQuery传入参数不能为空");
}
using (conn = new SqlConnection())
{
conn.ConnectionString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
conn.Open();
com.Connection = conn;
com.CommandText = sqlStr;
//查询结果临时阅读器,连接关闭之后清空缓存
SqlDataReader reader = null;
//泛型结果集容器
List<T> res = new List<T>();
try
{
reader = com.ExecuteReader();//执行,返回结果集
//给结果集容器赋值
while (reader.Read())
{
T t = Activator.CreateInstance<T>();
foreach (PropertyInfo param in t.GetType().GetProperties())
{
//Entity实体名称可以大小写,查询结果集必须全部小写
int index = reader.GetOrdinal(param.Name.ToLower());
var tempVar = reader[index];
String tempStr = "";
tempStr = tempVar.ToString().Trim();
param.SetValue(t, tempStr, null);
}
res.Add(t);
}
}
catch (Exception e)
{
Trace.WriteLine(Tag + "SqlQuery异常>>>" + e.ToString());
//进行比较牛逼的操作.remark
}
finally
{
reader.Close();
conn.Close();
}
return res;
}
}
}
网友评论