作者总结了一下,使用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语句方法,其他两种都大致相同。作者就不再赘述了,如有错误欢迎指正,如若转载,请标注出处。

基于三层架构下的公共数据访问方法(Sqlite数据库)的更多相关文章

  1. MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构

    在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...

  2. MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  3. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  4. MVC项目实践,在三层架构下实现SportsStore-08,部署到IIS服务器

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  5. Delphi数据库的三层架构的问题和解决方法

    Delphi数据库的三层架构的问题和解决方法 原创 2014年03月26日 16:26:03 标签: Delphi / 数据库三层架构 / DCOM / DCOMConnection 790 //-- ...

  6. 三层架构下的EntityFramework codefirst

    好久没写博客了,今天研究了EF框架的CodeFirst模式,从字面意思可以看出,代码优先.所谓代码优先,与以往的添加ado.net不同,主要是编写代码生成数据库和数据表,生成数据实体映射.个人感觉这种 ...

  7. MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  8. MVC项目实践,在三层架构下实现SportsStore-04,实现分页

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  9. MVC项目实践,在三层架构下实现SportsStore-05,实现导航

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

随机推荐

  1. 阿里云windows 2008 服务器处理挖矿程序 Miner

    阿里云盾最近报发现wanacry蠕虫病毒和挖矿进程异常 仔细检查进程后,发现两个奇怪的进程 Eternalblue-2.2.0.exe,winlogins.exe 特别是伪装成 winlogins.e ...

  2. Java ascii码值转为输出ascii码

    Java ascii码值转为输出ascii码 public static void main(String[] args) { // TODO Auto-generated method stub S ...

  3. freopen()函数在ACM中的使用

    #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif https://blog.csdn.net/c ...

  4. C# Winform 中DataGridView 实现单元格输入下拉框功能

    https://blog.csdn.net/ad13adsa/article/details/82108969 private void dataGridViewX1_EditingControlSh ...

  5. java三种注释以及参数涵义(转)

    原文地址:https://www.cnblogs.com/miys/p/4bf714ce33068dcf9ac6526309c9b5e6.html 单行注释:// 注释内容 多行注释:/*... 注释 ...

  6. Latex 仅使用 hyperref 包中 \href 的方法

    参考: How to ask hyperref works only with href Latex 仅使用 hyperref 包中 \href 的方法 在 .tex 文件的开头使用如下方法引用 hy ...

  7. 剑指offer 09:变态跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. /* f(n-1) = f(n-2) + f(n-3) + ... + f(0 ...

  8. DAY 30 网络编程基础

    一.软件开发架构 1.c/s架构 c:客户端 s:服务端 2.b/s架构 b:浏览器 c:服务器 手机端:好像C/S架构比较火,其实不然,微信小程序.支付宝第三方接口 B/S架构的优点是统一接口 PC ...

  9. GT sport真实赛道详解 - Brands Hatch | 伯蘭士赫治GP賽車場

    参考:GT sport所有赛道简介 GT Sport - Tip/Guide For FASTER LAP TIMES (Brands Hatch) 赛道介绍.跑法.赛事网上都有大把的视频. GT s ...

  10. 自动车牌识别(ALPR)---https://blog.csdn.net/ELEVEN_ZOU/article/details/80893579

    1.基本功能:从一张或者一系列的图片中提取车牌信息,比如车牌号码.车牌颜色等信息. 2.功能扩展:车型.车品牌.车牌类型等. 3.应用方向:电子交易系统(停车自动收费.收费站自动支付等).交通执法.交 ...