数据访问层DataAccess

JavaScript 高性能编程 —— Data Access 数据访问 经典计算机科学的一个问题是确定数据应当存放在什么地方,以实现最佳的读写效率。数据存储在哪里, 关系到代码运行期间数据被检索到的速度。在 JavaScript 中,此问题相对简单,因为数据存储只有少量方 式可供选择。正如其他语言那样,数据存储位置关系到访问速度。每一种数据存储位置都具有特定的读写操作负担。大多数情况下,对一个直接量和一个局部变量数据访 问的性能差异是微不足道的。访问数组项和对象成员的代价要高一些,具体高多少,很大程度上依赖于浏 览器。 阅读详情

using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
namespace DataAccess
{
 /// <summary>
 /// DataBase 的摘要说明。
 /// </summary>
 public class DataBase
 {
  private SqlConnection vConn=null;
  public DataBase()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  /// <summary>
  /// 该函数用于打开conn
  /// </summary>
  /// <param name="vConn"></param>
  /// <returns>返回""表示没有出错。</returns>
  private String OpenConn(SqlConnection vConn)
  {
   try
   {
    if(vConn==null)
     vConn=new SqlConnection();
    vConn.ConnectionString=JRD.SystemCommon.SysOpVar.ConnString;
    vConn.Open();
    return "";
   }
   catch
   {
    return "连接错误";
   }
  } 
  /// <summary>
  /// 功能:执行增加,修改,删除操作
  /// </summary>
  /// <param name="vSql">输入:执行的SQL语句</param>
  /// <returns>输出:成功true, 失败false</returns>
  public bool ExecSQL(string vSql)
  {
   SqlCommand vCmd = null;
   bool vRet =false;   
   vConn = new SqlConnection();
   if(OpenConn(vConn) != "") //返回不为空值,则连接错误
    return false;
   else
   {
    try
    {
     vCmd = new SqlCommand(vSql, vConn);
     if (vCmd.ExecuteNonQuery() == 0)
     {
      vRet = false;
     }
     else
      vRet = true;
    }  
    catch
    {
     vRet=false;
    }
    finally
    {
     vConn.Close();
     vConn = null;
    }
    return vRet;
   }
           
         }
  /// <summary>
  /// 该函数直接用commandtext属性直接更新数据库数据,同时往系统日志库中插入数据
  /// </summary>
  /// <param name="SqlList">sqllist为多条sql语句集.</param>
  /// <returns>boolAppXtrz 判断是否要添加系统日志表记录,执行成功返回""</returns>
  public bool ExecuteSqlList(ArrayList SqlList)
  {
   SqlCommand vCmd= null;
   vConn = new SqlConnection();
   if(OpenConn(vConn) != "") //返回不为空值,则连接错误
    return false;
   else
   {
    SqlTransaction MyTran;
    int i;
    MyTran = vConn.BeginTransaction();
    vCmd = new SqlCommand();
    vCmd.Connection = vConn;    
    vCmd.Transaction = MyTran;
    try
    {
     for(i = 0;i<SqlList.Count;i++)
     {      
      vCmd.CommandText = SqlList[i].ToString();
      vCmd.ExecuteNonQuery();
     }
     MyTran.Commit();
     return true;
    }
    catch
    {
     return false;    
    }
    finally
    {
     vCmd =null;
     MyTran = null;
     vConn.Close();
     vConn = null;
    }
   }   
  }
  public SqlDataReader GetDataReader(string vSql)
  {
   SqlCommand vCmd=null;
   vConn = new SqlConnection();
   if(OpenConn(vConn) != "") //返回不为空值,则连接错误
    return null;
   else
   {
    try
    {
     vCmd = new SqlCommand(vSql, vConn);
     return vCmd.ExecuteReader(CommandBehavior.CloseConnection);
    }
    catch
    {
     return null;
    }
   }
  }
  public DataSet GetDataSet(string vSql)
  {
   SqlCommand vCmd=null;
   vConn = new SqlConnection();
   if(OpenConn(vConn) != "") //返回不为空值,则连接错误
    return null;
   else
   {
    try
    {
     vCmd = new SqlCommand(vSql, vConn);
     SqlDataAdapter vDtAdpt = new SqlDataAdapter();
     vDtAdpt.SelectCommand = vCmd;
     DataSet vDtset = new DataSet();
     vDtAdpt.Fill(vDtset, "pubtable");
     return vDtset;
    }
    catch
    {
     return null;
    }
    finally
    {
     vCmd=null;
     vConn.Close();
     vConn=null;
    }
   }
  }
  public DataTable GetDataTable(string vSql)
  {
   if(GetDataSet(vSql)==null)
    return null;
   else
       return GetDataSet(vSql).Tables[0];
  }
  /// <summary>
  /// 该函数用于绑定dataview
  /// </summary>
  /// <param name="strSql"></param>
  /// <param name="DV"></param>
  /// <returns></returns>
  public bool GetDataView(string strSql,DataView DV)
  {
   SqlDataAdapter Adapter = new SqlDataAdapter();
   DataSet DS = new DataSet();
   DataTable DTable =new DataTable();
   if(OpenConn(vConn) != "") //返回不为空值,则连接错误
    return false;
   else
   {
    try
    {
     Adapter = new SqlDataAdapter(strSql, vConn);
     Adapter.Fill(DS, "_tem");
     DTable = DS.Tables["_tem"];
     DV = new DataView(DTable);
     if(DV.Count == 0)  return false;
     else
      return true;
    }
    catch
    {
     return false;
    }
    finally
    {
     Adapter.Dispose();
     Adapter = null;
     DS.Dispose();
     DS = null;
     vConn.Close();
     vConn=null;
    }
   }
  }
  /// <summary>
  /// 取一个值的Sql语句,可以根据id去名称
  /// </summary>
  /// <param name="vSql"></param>
  /// <returns></returns>
  public object GetOneValue(string vSql)
  {
   SqlDataReader vDr=null;
   object vResult =null;
   try
   {
    vDr= GetDataReader(vSql);
    if(vDr.Read())
     vResult = vDr.GetValue(0);       
    vDr.Close();
   }
   catch
   {
    vResult=null;
   }
   finally
   {
    if(vDr != null)
    {
     vDr.Close();
     vDr=null;
    }
   }
            return vResult;
  }
  /// <summary>
  /// 取数据库中的最大值加1,通常用于增加数据
  /// </summary>
  /// <param name="vTableName"></param>
  /// <param name="vFieldName"></param>
  /// <returns></returns>
  public string MaxId(string vTableName,string vFieldName, string WhereSql)
  {
   string vSql =" select Max("+vFieldName+") as fMaxid from "+vTableName+" ";
   if(WhereSql!="")
    vSql+= WhereSql;

   string vId;
   object vMaxId = GetOneValue(vSql);
   if(vMaxId ==DBNull.Value)
    vId="1";
   else
    vId=(Int32.Parse(vMaxId.ToString()) + 1).ToString();

      return vId;
  }
       /// <summary>
       /// 返回最大值加1的编码
       /// </summary>
       /// <param name="TableName"></param>
       /// <param name="KeyFieldName"></param>
       /// <param name="KeyFieldLength"></param>
       /// <param name="WhereSql"></param>
       /// <returns></returns>
  public string GetMaxID(string TableName,string KeyFieldName,byte KeyFieldLength,string WhereSql)
  {
   string vMax = MaxId(TableName,KeyFieldName,WhereSql);
   string vMaxId="";
   if(KeyFieldLength>vMax.Length )
   {
    for(int i=0;i<KeyFieldLength - (vMax).Length;i++)
    {
     vMaxId+="0";
    }
   }
   return vMaxId+vMax;
  }
  /// <summary>
  /// 记录的条数
  /// </summary>
  /// <param name="vSql"></param>
  /// <returns></returns>
  public int GetRowCount(string vSql)
  {
            DataTable vDt =GetDataTable(vSql);
   return vDt.Rows.Count;
  }
  /// <summary>
  /// 是否存在记录
  /// </summary>
  /// <param name="vSql"></param>
  /// <returns></returns>
  public bool IsRecordExist(string vSql)
  {
   if(GetRowCount(vSql)>0)
    return true;
   else
    return false;
  }
  /// <summary>
  /// 该函数用于获得sql语句的第一条记录
  /// sql语句返回为空的时候,返回"null"或者Rowlist的Count=0
  /// </summary>
  /// <param name="Strsql"></param>
  /// <param name="RowList"></param>
  /// <returns>出错返回""</returns>
  public string GetFirstRow(string Strsql, ArrayList RowList)
  {
   SqlDataReader Reader;
   string strReturnValue="";
   Reader=GetDataReader(Strsql);
   return strReturnValue;
  }
 //
 //------------------------执行存储过程--------------------
  /// <summary>
  /// Private routine allowed only by this base class, it automates the task
  /// of building a OdbcCommand object designed to obtain a return value from
  /// the stored procedure.
  /// </summary>
  /// <param name="vStoredProc">Name of the stored procedure in the DB, eg. sp_DoTask</param>
  /// <param name="vParameters">Array of IDataParameter objects containing vParameters to the stored proc</param>
  /// <returns>Newly instantiated OdbcCommand instance</returns>
  private SqlCommand BuildIntCommand(string vStoredProc, IDataParameter[] vParameters)
  {
   SqlCommand vCmd = BuildQueryCommand( vStoredProc, vParameters );
   vCmd.Parameters.Add( new SqlParameter ( "@ReturnValue",
    System.Data.SqlDbType.Int,
    4, /* Size */
    ParameterDirection.ReturnValue,
    false, /* is nullable */
    0, /* byte precision */
    0, /* byte scale */
    string.Empty,
    DataRowVersion.Default,
    null ));

   return vCmd;
  }


  /// <summary>
  /// Builds a OdbcCommand designed to return a OdbcDataReader, and not
  /// an actual integer value.
  /// </summary>
  /// <param name="vStoredProc">Name of the stored procedure</param>
  /// <param name="vParameters">Array of IDataParameter objects</param>
  /// <returns></returns>
  public SqlCommand BuildQueryCommand(string vStoredProc, IDataParameter[] vParameters)
  {
   SqlCommand vCmd = new SqlCommand( vStoredProc, vConn );
   vCmd.CommandType = CommandType.StoredProcedure;
   foreach (SqlParameter parameter in vParameters)
   {
    vCmd.Parameters.Add( parameter );
   }

   return vCmd;
  }

  public object ExecProcedure(string vStoredProc, IDataParameter[] vParameters)
  {
   object vRet = 0;
   SqlDataReader vDr = RunProcedure (vStoredProc, vParameters);
   if (vDr.Read ())
   {
    vRet = vDr.GetValue (0);
    while (vDr.Read ());
   } 
   vDr.Close ();

   return vRet;
  }

  public int ExecProcedureNonQuery(string vStoredProc, IDataParameter[] vParameters)
  {
   vConn.Open ();
   SqlCommand vCmd = BuildQueryCommand( vStoredProc, vParameters );
   int vRowsAffected = vCmd.ExecuteNonQuery();   
   vConn.Close();
   return vRowsAffected;
  }


  /// <summary>
  /// Will run a stored procedure, can only be called by those classes deriving
  /// from this base. It returns a OdbcDataReader containing the vRet of the stored
  /// procedure.
  /// </summary>
  /// <param name="vStoredProc">Name of the stored procedure</param>
  /// <param name="vParameters">Array of vParameters to be passed to the procedure</param>
  /// <returns>A newly instantiated OdbcDataReader object</returns>
  public SqlDataReader RunProcedure(string vStoredProc, IDataParameter[] vParameters )
  {
   vConn.Open();
   SqlCommand vCmd = BuildQueryCommand( vStoredProc, vParameters );
   vCmd.CommandType = CommandType.StoredProcedure;

   return vCmd.ExecuteReader(CommandBehavior.CloseConnection);
  }

  /// <summary>
  /// Creates a DataSet by running the stored procedure and placing the vRets
  /// of the query/proc into the given tablename.
  /// </summary>
  /// <param name="vStoredProc"></param>
  /// <param name="vParameters"></param>
  /// <param name="vTableName"></param>
  /// <returns></returns>
  public DataSet RunProcedure(string vStoredProc, IDataParameter[] vParameters, string vTableName)
  {
   vConn.Open();

   DataSet vDSet = new DataSet ();
   SqlDataAdapter vAdtr = new SqlDataAdapter();
   vAdtr.SelectCommand = BuildQueryCommand(vStoredProc, vParameters);
   vAdtr.Fill(vDSet, vTableName);

   vConn.Close();

   return vDSet;
  }

  /// <summary>
  /// Takes an -existing- dataset and fills the given table name with the vRets
  /// of the stored procedure.
  /// </summary>
  /// <param name="vStoredProc"></param>
  /// <param name="vParameters"></param>
  /// <param name="vDSet"></param>
  /// <param name="vTableName"></param>
  /// <returns></returns>
  public void RunProcedure(string vStoredProc, IDataParameter[] vParameters, DataSet vDSet, string vTableName )
  {
   vConn.Open();
   SqlDataAdapter sqlDA = new SqlDataAdapter();
   sqlDA.SelectCommand = BuildQueryCommand( vStoredProc, vParameters );
   sqlDA.Fill( vDSet, vTableName );

   vConn.Close();   
  }
  //
 }
}

WEB技术之四层架构浅谈 如果你的系统是大型的软件开发,那你就要做好更多层的分解,但是原则和理论上,我认为,不用分得太细。我们都知道,MVC模式把系统,分成Model、View、Controller。这样的分法是把表示层同逻辑层分开,也就是说把页面设计师同软件设计师分开。系统分析师再把各个功能写成接口,软件设计师就可以通过业务逻辑来写程序。我所说的四层架构的分法,就是想把软件设计师工作量降下来,减少重复性的代码,提高开发速 阅读详情

相关推荐

oracle.dataaccess

Oracle.DataAccess.dll x86 x64 用于asp.net连接Oracle数据库

多层结构应用系统(教务管理系统)

看到一些博文提到用博客的形式记录自己对当前知识的总结,觉得这个主意还不错,因为自己对学过的知识很少去总结,学过了当时感觉掌握了,所以很少回过头思考,有时候又用到以前的知识点发现不会了,对那个知识点也很陌生。以前应该属于老师讲一点会一点的那种,现在好点了,有点想法可是还是感觉自己很迷茫,有种不知所云的感觉,所以试着写下自己最经两周在老师带领下开发的简单管理系统。    多层  包括有: 表示层,

石头 831

DataAccess

DataAccess数据库连接

.NET/C#大型项目研发必备(7)--DataAccess数据库访问技术

常见的ORM技术(比如:Entity Framework,Dapper,SqlSugar,NHibernate,等…),它们不是在做Sql语句的程序化变种,就是在做Sql语句的面向对象化。缺点显而易见:把简单的Sql语句复杂化、不伦不类、不符合标准的各家自定义语法格式、无统一标准难以大规模推广应用… 而ADO.NET也存在操作复杂、不同类型数据库(SqlServer、MySql、Oracle、等)操作代码需要重构等缺点。 本文要介绍的主角DeveloperSharp框架中的ORM数据库访问技术,则巧妙的规

首席架构师 ◆ 顶尖领航员 ◆ 研发金字塔 ◆ 互联网基础架构 1792

Oracle.DataAccess 64位/32位 各版本集合

Oracle.DataAccess各版本集合,包32位、64位。

PR控制以及使用PR控制用于单相离/并网逆变器

最近想学习一下并网逆变器,需要用到PR控制,全网找遍了许多学习资料,终于掌握的差不多了,在此做个记录,以及个人对PR(Proportional Resonant)控制的理解。在去年7月准备电赛的时候偶然看到有几篇讲解数字滤波器,第一次接触传递函数离散化,深刻被数字时代的数字方式折服,改改代码,就可以实现不同的截至频率,甚至不同阶数,而模拟方式还要改元器件。当时就感觉这玩意太他妈牛逼了,很想学懂它,奈何学不会呀。后面全身心做电赛,就忘了这事儿。直至最近学习PR控制,当初的感觉又回来了,一股劲儿吃下来了。

xht2403267701的博客 3万+

DataAccessException产生原因及解决方案

是一个通用的异常,涵盖了数据库访问过程中可能出现的各种问题。通过仔细检查 SQL 语法、确保数据一致性、处理连接问题、优化资源使用、管理并发访问、验证数据库结构、检查用户权限、正确配置事务管理以及确保数据库驱动兼容性,可以有效预防和处理。

境里婆娑 2458

python操作git推送自己分支并合并主分支(持续优化该工具)

python git

qq_44707265的博客 862

spring学习之Data Access

一图千言之spring模块组成 Transaction Management 全面的事务支持。Spring Framework 为事务管理提供了一致的抽象,具有以下优点 跨不同事务 API 的一致编程模型,例如 Java 事务 API (JTA)、JDBC、Hibernate 和 Java Persistence API (JPA)。 支持声明式事务管理。 比复杂的事务 API(例如 JTA)更简单的用于程序化事务管理的 API。 与 Spring 的数据访问抽象

MineCodelife的博客 986

“迎圣诞,拿大奖” 活动赛题 Web-SQLi

1. php中sprintf()函数漏洞原理及其利用; 2. mysql盲注语法及python脚本; 3. sqlmap的需要进一步学习;

qq_34106499的博客 674

二维卡尔曼滤波位置,速度融合

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

Johnlee2019的博客 8451

推荐使用EntityFrameworkCore.DataAccess:现代化的.NET数据访问层

推荐使用EntityFrameworkCore.DataAccess:现代化的.NET数据访问层 1、项目介绍 EntityFrameworkCore.DataAccess是一个专为.NET和Microsoft.EntityFrameworkCore设计的现代、通用的数据访问结构。它巧妙地集成了UnitOfWork模式、Repository模式以及QueryBuilder模式,旨在简化数据库操作并...

gitblog_00020的博客 522

前端使用二开Thingsboard一、二、三事(三)-规则链

以项目实战为基础,逐步介绍前端在thingsboard系统二次开发中的一些注意事项以及一些thingsboard一些页面功能讲解,为前端人员开发使用thingsboard提供一种可靠思路,打造一个完美的物联网系统。

weixin_43163457的博客 863

dNet项目数据访问层代码总结

数据访问层,即DataAccess层。 下面放送一些奶酪; 实例1 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Com.ERuipan.DataAccessLirary; using System.Data; using System.Data.

bcbobo21cn的专栏 773

用 SemanticObject 把字段变成可点击链接:Fiori Elements Navigation Using a Link 的工程化实践

SAP Fiori elements 通过 Common.SemanticObject 注解可将字段转为可点击链接,实现应用间跳转。当源字段名与目标属性名不一致时,需使用 Common.SemanticObjectMapping 进行映射。该功能依赖 Fiori Launchpad 的目标映射配置,确保正确解析 semantic object + action 并传递参数。常见误区包括未配置目标映射或字段映射错误,需逐一检查语义标注、intent 解析和参数传递链路。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 272

预编码算法(个人总结)

预编码算法是无线通信系统中的关键技术,通过在发送端对信号进行处理,可以有效减少干扰,提高系统性能。预编码算法在5G、Wi-Fi、卫星通信等领域具有广泛的应用前景,同时,随着深度学习、大规模MIMO和物理层安全等技术的发展,预编码算法的研究将进一步推动无线通信技术的发展。CSI的准确性直接影响到预编码的效果。预编码是一种在发送端对信号进行线性变换的技术,以优化信号的空间分布,使得接收端能够更好地接收和解码信号。预编码算法,特别是基于矩阵分解的预编码算法,计算复杂度较高,限制了其在实际系统中的应用。

年糕的博客 5288

修改子窗体下的值的时候,把主窗体下treeview内与子窗体对应的值一起修改

第一步:修改子窗体下的值 IDAL里的内容: DAL里的内容: DataAccess里的内容: BLL里的内容: 第二步:主窗体下treeview节点名称修改以及节点名称查询 IDAL里的内容: DAL里的内容: DataAccess里的内容: BLL里的内容: 第三步:子窗体下写的内容

SunShine_bqy的博客 575

如何在 R 中执行 Kruskal-Wallis 检验

Kruskal-Wallis 检验用于确定三个或更多独立组的中位数之间是否存在统计学上的显着差异。它被认为是单向方差分析的非参数等效项。本教程介绍了如何在 R 中执行 Kruskal-Wallis 检验。示例:R 中的 Kruskal-Wallis 检验 假设研究人员想知道三种不同的肥料是否会导致不同水平的植物生长。他们随机选择 30 种不同的植物并将它们分成三组,每组 10 株,每组施用不同的肥料。在一个月结束时,他们测量每株植物的高度。使用以下步骤执行 Kruskal-Wallis 检验以确定三个组的中

Mrrunsen的博客 3797

PetShop4数据访问层探秘

namespace PetShop.DALFactory: 我们已经很清楚的知道:PetShop4中的数据访问层采用的是典型的工厂模式设计,而实现工厂模式的项目就是DALFactory,该项目中只有一个封装类(sealed):DataAccess,封装表明该类不能被继承,原代码中对类的描述如下: /// /// This class is implemented following the

Lucker's PowerSpace 1019

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Asp.net三层架构之数据访问层(MS SQL 2000版)

DataAccess.csusing System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System

wenchang4you的专栏 806

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

总结学习的程序结构

利用自己写过的一小段代码总结写,可能文字的表述太少,重在理解程序的结构1 典型三层 数据表-----------> common类库-------> dataAccess 类库--------> business类库-------->web表示思想:首先设计好数据表,然后将表映射成common类(数据缓存在内存中),其次编写数据访问层dataAccess,访问数据库的参数从co

小 牛 554

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

.net web 架构浅谈

让我们先看看经典的三层架构 ,然后讲讲各个层次的用处和特点一般web应用程序包含下列层次WebUI|WinUI|WebService:界面和webservice Business Facade:业务层的包装 Business Rule:业务规则 DataAccess:数据访问 SystemFramework:框架,为上面的层提供一些公共的方法和工具类,比如配置文件,日志和缓存等等 Common

朱燚 2554

javaweb三大框架

1.Javaweb经历了三个时期 ①JSP Model1第一代  JSP Model1是JavaWeb早期的模型,它适合小型Web项目,开发成本低!Model1第一代时期,服务器端只有JSP页面,所有的操作都在JSP页面中,连访问数据库的API也在JSP页面中完成。也就是说,所有的东西都耦合在一起,对后期的维护和扩展极为不利。 ②JSP Model1第二代  JSP Mod

yilaguandemei的博客 2571

系统框架说明

<!-- @page {margin:2cm} h3 {margin-top:0.46cm; margin-bottom:0.46cm; direction:ltr; color:#000000; line-height:173%; text-align:justify; page-break-inside:avoid; widows:0; orphan

熊尧的专栏 2434

Linq to Mysql (Dblinq) 记录

(数据访问层独立)一、工具:Dblinq 1.8 CTP1;MySQL 5.1 GA;VS2008 SP1二、生成ORM的DataContext cs文件DbMetal.exe -provider=MySql -database:test -server:localhost -user:root -password:ikmb -namespace:mysqllinq -code:mysqllinq

ikmb的专栏 2663

一个中型OA系统的架构过程(二)

    接上文,我们讲解了UI界面层的在设计初期的架构部分,由于是在系统分析还没有全面展开的情况下先做的初期架构,所以中间业务逻辑部分我们暂时放下,先来考虑数据访问层的一些问题。    2.数据访问层:分两个工程,一工程主要封装数据库访问及操作的对像,我将其命名为DataBaseOption,另一工程主要功能为负责业务逻辑对操作数据库部分的功能进行构造一些操作数据库的规则然后调用DataBaseO

编码人生 1890
上一篇: 通过存储过程访问SQL数据
下一篇: Asp.net+Xml实现无数据库论坛一点即通
Jasonchen82
博客等级 码龄25年 3粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值