基于三层架构下的公共数据访问方法(Sqlite数据库)
基于三层架构下的公共数据访问方法(Sqlite数据库)
作者总结了一下,使用Winform的三层架构做窗体应用程序,在数据访问方面,有用到纯sql语句方法、参数方法、存储过程方法。
那么什么是三层架构呢?
UI—存放Form窗体—(用户所关心的)
业务逻辑层—-存放业务传递(BLL)
数据访问层—-底层的数据处理方法(DAL)
数据公共访问方法—SqlHelper(DBUtilty)
使用三层架构设计Winform程序,能够达到”高内聚、低耦合“.团队分工明确,适用于大型的企业级项目
现在我提供一下SQLite数据库的访问方法
第一步:配置数据库。在App.config里
<connectionStrings>
<add name=”sqlite” connectionString=”data source=|datadirectory|..\..\Hosptial.db;Pooling=true;FailIfMissing=false” providerName=”System.Data.SQLite” />
</connectionStrings>
注意:我把数据库文件放在外层了,所以就必须多加【..\..\】,如果放在bin–debug文件加下就要写成|datadirectory|Hosptial.db
第二部:连接配置文件
1.新建一个类SqlHelper.引入命名空间:using System.Data; using System.Data.Sqlite; using System.Configuration;
2.添加引用:引用–添加引用–勾选System.Configuration
3.连接配置文件:在类中添加代码: private static string conn = ConfigurationManager.ConnectionStrings[“sqlite”].ToString();
注意:中括号里的[“___”]名称必须要与App.Config里的connectionStrings的name相同,否则会出现异常
4.建立公共方法(错误输出到本地的方法,参照我的另一篇博客https://www.cnblogs.com/970728-qi/p/9826476.html)
- 普通数据访问方法
//1.执行sql语句,并返回受影响的行数,在使用Command向数据库发送增、删、改命令时,通常使用ExecuteNonQuery方法 public static int Update(string sql) { SQLiteConnection sqlcon = new SQLiteConnection(conn); SQLiteCommand sqlcmd = new SQLiteCommand(sql, sqlcon); try { sqlcon.Open(); return sqlcmd.ExecuteNonQuery(); } catch (Exception e) { PrintError(e.Message);//将错误信息保存到本地 throw new Exception("调用 public static int Update(string sql)方法时出错" + e.Message); } finally { sqlcon.Close();//关闭练连接 } }
//2.执行Sql语句,返回结果集的第一行,第一列。通常使用ExecuteScalar方法 public static object SingResult(string sql) { SQLiteConnection sqlcon = new SQLiteConnection(conn); SQLiteCommand sqlcmd = new SQLiteCommand(sql, sqlcon); try { sqlcon.Open(); return sqlcmd.ExecuteScalar(); } catch (Exception e) { PrintError(e.Message); throw new Exception("调用public static object SingResult(string sql)方法时出错:" + e.Message); } finally { sqlcon.Close(); } }
//3.执行sql语句,生成一个包含数据的SQLiteDataReader对象实例 public static SQLiteDataReader GetReader(string sql) { SQLiteConnection sqlcon = new SQLiteConnection(conn); SQLiteCommand sqlcmd = new SQLiteCommand(sql, sqlcon); try { sqlcon.Open(); return sqlcmd.ExecuteReader(CommandBehavior.CloseConnection); } catch (Exception e) { sqlcon.Close(); PrintError(e.Message); throw new Exception("调用public static SQLiteDataReader GetReader(string sql)方法时出错:" + e.Message); } }
//4.产生dataTable对象 public static DataTable GetDataTable(string sql) { SQLiteConnection sqlcon = new SQLiteConnection(conn); SQLiteCommand sqlcmd = new SQLiteCommand(sql, sqlcon); SQLiteDataAdapter da = new SQLiteDataAdapter(sqlcmd);//创建适配器对象 DataTable table = new DataTable(); try { sqlcon.Open(); da.Fill(table); return table; } catch (Exception e) { PrintError(e.Message); throw new Exception("调用public static DataSet GetDataSet(string sql)方法时出错:" + e.Message); } finally { sqlcon.Close(); } }
- 参数方法
public static int UpdateParam(string sql, SQLiteParameter[] parameter) { SQLiteConnection sqlcon = new SQLiteConnection(conn); SQLiteCommand sqlcmd = new SQLiteCommand(sql, sqlcon); try { sqlcon.Open(); sqlcmd.Parameters.AddRange(parameter); return sqlcmd.ExecuteNonQuery(); } catch (Exception e) { PrintError(e.Message); throw new Exception("调用 public static int UpdateParam(string sql, SQLiteParameter[] parameter)方法时出错" + e.Message); } finally { sqlcon.Close(); } } public static object SingleResultParam(string sql, SQLiteParameter[] parameter) { SQLiteConnection sqlcon = new SQLiteConnection(conn); SQLiteCommand sqlcmd = new SQLiteCommand(sql, sqlcon); try { sqlcon.Open(); sqlcmd.Parameters.AddRange(parameter); return sqlcmd.ExecuteScalar(); } catch (Exception e) { PrintError(e.Message); throw new Exception("调用 public static object SingleResultParam(string sql, SQLiteParameter[] parameter)方法时出错" + e.Message); } finally { sqlcon.Close(); } } public static SQLiteDataReader GetReaderParam(string sql, SQLiteParameter[] parameter) { SQLiteConnection sqlcon = new SQLiteConnection(conn); SQLiteCommand sqlcmd = new SQLiteCommand(sql, sqlcon); try { sqlcon.Open(); sqlcmd.Parameters.AddRange(parameter); return sqlcmd.ExecuteReader(CommandBehavior.CloseConnection); } catch (Exception e) { sqlcon.Close(); PrintError(e.Message); throw new Exception("调用public static SQLiteDataReaderParam GetReader(string sql,SQLiteParameter[] parameter)方法时出错" + e.Message); } }
- 存储过程方法
public static int UpdateProce(string spName, SQLiteParameter[] parameter) { SQLiteConnection sqlcon = new SQLiteConnection(conn); SQLiteCommand sqlcmd = new SQLiteCommand(spName, sqlcon); try { sqlcon.Open(); sqlcmd.CommandType = CommandType.StoredProcedure; sqlcmd.Parameters.AddRange(parameter); return sqlcmd.ExecuteNonQuery(); } catch (Exception e) { PrintError(e.Message); throw new Exception("调用public static int UpdateProce(string spName,SQLiteParameter[] parameter)方法出错:" + e.Message); } finally { sqlcon.Close(); } } public static object SingleResultProc(string spName, SQLiteParameter[] paramter) { SQLiteConnection sqlcon = new SQLiteConnection(conn); SQLiteCommand sqlcmd = new SQLiteCommand(spName, sqlcon); try { sqlcon.Open(); sqlcmd.CommandType = CommandType.StoredProcedure; sqlcmd.Parameters.AddRange(paramter); return sqlcmd.ExecuteScalar(); } catch (Exception e) { PrintError(e.Message); throw new Exception("调用 public static object SingleResultProc(string spName,SQLiteParameter[] paramter)方法出错:" + e.Message); } finally { sqlcon.Close(); } } public static SQLiteDataReader GetReaderProc(string spName, SQLiteParameter[] parameter) { SQLiteConnection sqlcon = new SQLiteConnection(conn); SQLiteCommand sqlcmd = new SQLiteCommand(spName, sqlcon); try { sqlcon.Open(); sqlcmd.Parameters.AddRange(parameter); sqlcmd.CommandType = CommandType.StoredProcedure; return sqlcmd.ExecuteReader(CommandBehavior.CloseConnection); } catch (Exception e) { sqlcon.Close(); PrintError(e.Message); throw new Exception("调用 public static SQLiteDataReader GetReaderProc(string spName, SQLiteParameter[] parameter)方法出错:" + e.Message); } }
因为会写第一个基本的sqlite语句方法,其他两种都大致相同。作者就不再赘述了,如有错误欢迎指正,如若转载,请标注出处。