基于.NET平台的分层架构实战(七)数据访问层的第一种实现:A
经过上面篇文章的介绍,整个系统的 框架 算是基本搭建完了,下面,我们要具体 实现 各个层次。关于 数据 访问 层的 实现 ,我准备讨论三种 实现 方式,这一篇文章讨论 第一 种:Access+动态生成SQL。 顾名思义,这种 实现 将使用Access作为后台 数据 库,而
经过上面篇文章的介绍,整个系统的框架算是基本搭建完了,下面,我们要具体实现各个层次。关于数据访问层的实现,我准备讨论三种实现方式,这一篇文章讨论第一种:Access+动态生成SQL。
顾名思义,这种实现将使用Access作为后台数据库,而操作方式也是最基本的使用SQL命令。
在具体编写实现代码之前,我们需要做一些准备工作:
第一步,我们要将Access数据库搭建完成,具体做法如下。
在Web工程下新建一个文件夹,命名为AccessData,并在其中新建一个mdb文件(即Access数据库文件),按照前面介绍过的数据库设计构架,将数据表及表间关系建好,这里不再赘述。
第二步,我们要进行一些配置。
打开Web工程下的Web.config文件,在其中的appSettings节点下,添加如下键值:
第一条为Access的连接字符串,第二条为Access数据库文件的路径,其中“~”表示网站根目录。
第三步,新建一个工程。
我们要新建一个工程AccessDAL,用来存放Access数据访问层的代码。
准备工作做完了,现在来实现具体的代码。
1.编写数据访问助手类
因为很多数据访问操作流程很相似,所以,这里将一些可复用的代码抽取出来,编写成助手类,以此减少代码量,提高代码复用性。
这个助手类放在AccessDAL下,叫AccessDALHelper,主要负责Access数据库的访问。它包括三个方法:
GetConnectionString:从配置文件中读取配置项,组合成连接字符串。
ExecuteSQLNonQuery:执行指定SQL语句,不返回任何值,一般用于Insert,Delete,Update命令。
ExecuteSQLDataReader:执行SQL语句返回查询结果,一般用于Select命令。
具体代码如下:
AccessDALHelper.cs:
AccessDALHelper
- 1using System;
- 2using System.Web;
- 3using System.Web.Caching;
- 4using System.Configuration;
- 5using System.Data;
- 6using System.Data.OleDb;
- 7using NGuestBook.Utility;
- 8
- 9namespace NGuestBook.AccessDAL
- 10{
- 11 /**////
- 12 /// Access数据库操作助手
- 13 ///
- 14 public sealed class AccessDALHelper
- 15 {
- 16 /**////
- 17 /// 读取Access数据库的连接字符串
- 18 /// 首先从缓存里读取,如果不存在则到配置文件中读取,并放入缓存
- 19 ///
- 20 ///
Access数据库的连接字符串 - 21 private static string GetConnectionString()
- 22 {
- 23 if (CacheAccess.GetFromCache("AccessConnectionString") != null)
- 24 {
- 25 return CacheAccess.GetFromCache("AccessConnectionString").ToString();
- 26 }
- 27 else
- 28 {
- 29 string dbPath = ConfigurationManager.AppSettings["AccessPath"];
- 30 string dbAbsolutePath = HttpContext.Current.Server.MapPath(dbPath);
- 31 string connectionString = ConfigurationManager.AppSettings["AccessConnectionString"];
- 32
- 33 CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));
- 34 CacheAccess.SaveToCache("AccessConnectionString", connectionString.Replace("{DBPath}", dbAbsolutePath), fileDependency);
- 35
- 36 return connectionString.Replace("{DBPath}", dbAbsolutePath);
- 37 }
- 38 }
- 39
- 40 /**////
- 41 /// 执行SQL语句并且不返回任何值
- 42 ///
- 43 /// 所执行的SQL命令
- 44 /// 参数集合
- 45 public static void ExecuteSQLNonQuery(string SQLCommand,OleDbParameter[] parameters)
- 46 {
- 47 OleDbConnection connection = new OleDbConnection(GetConnectionString());
- 48 OleDbCommand command = new OleDbCommand(SQLCommand, connection);
- 49
- 50 for (int i = 0; i
- 51 {
- 52 command.Parameters.Add(parameters);
- 53 }
- 54
- 55 connection.Open();
- 56 command.ExecuteNonQuery();
- 57 connection.Close();
- 58 }
- 59
- 60 /**////
- 61 /// 执行SQL语句并返回包含查询结果的DataReader
- 62 ///
- 63 /// 所执行的SQL命令
- 64 /// 参数集合
- 65 ///
- 66 public static OleDbDataReader ExecuteSQLDataReader(string SQLCommand,OleDbParameter[] parameters)
- 67 {
- 68 OleDbConnection connection = new OleDbConnection(GetConnectionString());
- 69 OleDbCommand command = new OleDbCommand(SQLCommand, connection);
- 70
- 71 for (int i = 0; i
- 72 {
- 73 command.Parameters.Add(parameters);
- 74 }
- 75
- 76 connection.Open();
- 77 OleDbDataReader dataReader = command.ExecuteReader();
- 78 //connection.Close();
- 79
- 80 return dataReader;
- 81 }
- 82 }
- 83}
2.实现具体的数据访问操作类
因为前面已经定义了数据访问层接口,所以实现数据访问操作类就是很机械的工作了。下面仅以Admin的数据访问操作类为例:
AdminDAL:
AdminDAL
- 1using System;
- 2using System.Collections.Generic;
- 3using System.Text;
- 4using System.Data;
- 5using System.Data.OleDb;
- 6using NGuestBook.IDAL;
- 7using NGuestBook.Entity;
- 8
- 9namespace NGuestBook.AccessDAL
- 10{
- 11 public class AdminDAL : IAdminDAL
- 12 {
- 13 /**////
- 14 /// 插入管理员
- 15 ///
- 16 /// 管理员实体类
- 17 ///
是否成功 - 18 public bool Insert(AdminInfo admin)
- 19 {
- 20 string SQLCommand = "insert into [TAdmin]([Name],[Password]) values(@name,@password)";
- 21 OleDbParameter[] parameters ={
- 22 new OleDbParameter("name",admin.Name),
- 23 new OleDbParameter("password",admin.Password)
- 24 };
- 25
- 26 try
- 27 {
- 28 AccessDALHelper.ExecuteSQLNonQuery(SQLCommand, parameters);
- 29 return true;
- 30 }
- 31 catch
- 32 {
- 33 return false;
- 34 }
- 35 }
- 36
- 37 /**////
- 38 /// 删除管理员
- 39 ///
- 40 /// 欲删除的管理员的ID
- 41 ///
是否成功 - 42 public bool Delete(int id)
- 43 {
- 44 string SQLCommand = "delete from [TAdmin] where [ID]=@id";
- 45 OleDbParameter[] parameters ={
- 46 new OleDbParameter("id",id)
- 47 };
- 48
- 49 try
- 50 {
- 51 AccessDALHelper.ExecuteSQLNonQuery(SQLCommand, parameters);
- 52 return true;
- 53 }
- 54 catch
- 55 {
- 56 return false;
- 57 }
- 58 }
- 59
- 60 /**////
- 61 /// 更新管理员信息
- 62 ///
- 63 /// 管理员实体类
- 64 ///
是否成功 - 65 public bool Update(AdminInfo admin)
- 66 {
- 67 string SQLCommand = "update [TAdmin] set [Name]=@name,[Password]=@password where [ID]=@id";
- 68 OleDbParameter[] parameters ={
- 69 new OleDbParameter("id",admin.ID),
- 70 new OleDbParameter("name",admin.Name),
- 71 new OleDbParameter("password",admin.Password)
- 72 };
- 73
- 74 try
- 75 {
- 76 AccessDALHelper.ExecuteSQLNonQuery(SQLCommand, parameters);
- 77 return true;
- 78 }
- 79 catch
- 80 {
- 81 return false;
- 82 }
- 83 }
- 84
- 85 /**////
- 86 /// 按ID取得管理员信息
- 87 ///
- 88 /// 管理员ID
- 89 ///
管理员实体类 - 90 public AdminInfo GetByID(int id)
- 91 {
- 92 string SQLCommand = "select * from [TAdmin] where [ID]=@id";
- 93 OleDbParameter[] parameters ={
- 94 new OleDbParameter("id",id)
- 95 };
- 96
- 97 try
- 98 {
- 99 OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, parameters);
- 100 if (!dataReader.HasRows)
- 101 {
- 102 throw new Exception();
- 103 }
- 104
- 105 AdminInfo admin = new AdminInfo();
- 106 dataReader.Read();
- 107 admin.ID=(int)dataReader["ID"];
- 108 admin.Name=(string)dataReader["Name"];
- 109 admin.Password=(string)dataReader["Password"];
- 110
- 111 return admin;
- 112 }
- 113 catch
- 114 {
- 115 return null;
- 116 }
- 117 }
- 118
- 119 /**////
- 120 /// 按用户名及密码取得管理员信息
- 121 ///
- 122 /// 用户名
- 123 /// 密码
- 124 ///
管理员实体类,不存在时返回null - 125 public AdminInfo GetByNameAndPassword(string name, string password)
- 126 {
- 127 string SQLCommand = "select * from [TAdmin] where [Name]=@name and [Password]=@password";
- 128 OleDbParameter[] parameters ={
- 129 new OleDbParameter("name",name),
- 130 new OleDbParameter("password",password),
- 131 };
- 132
- 133 try
- 134 {
- 135 OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, parameters);
- 136 if (!dataReader.HasRows)
- 137 {
- 138 throw new Exception();
- 139 }
- 140
- 141 AdminInfo admin = new AdminInfo();
- 142 dataReader.Read();
- 143 admin.ID = (int)dataReader["ID"];
- 144 admin.Name = (string)dataReader["Name"];
- 145 admin.Password = (string)dataReader["Password"];
- 146
- 147 return admin;
- 148 }
- 149 catch
- 150 {
- 151 return null;
- 152 }
- 153 }
- 154
- 155 /**////
- 156 /// 按管理员名取得管理员信息
- 157 ///
- 158 /// 管理员名
- 159 ///
管理员实体类 - 160 public AdminInfo GetByName(string name)
- 161 {
- 162 string SQLCommand = "select * from [TAdmin] where [Name]=@name";
- 163 OleDbParameter[] parameters ={
- 164 new OleDbParameter("name",name),
- 165 };
- 166
- 167 try
- 168 {
- 169 OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, parameters);
- 170 if (!dataReader.HasRows)
- 171 {
- 172 throw new Exception();
- 173 }
- 174
- 175 AdminInfo admin = new AdminInfo();
- 176 dataReader.Read();
- 177 admin.ID = (int)dataReader["ID"];
- 178 admin.Name = (string)dataReader["Name"];
- 179 admin.Password = (string)dataReader["Password"];
- 180
- 181 return admin;
- 182 }
- 183 catch
- 184 {
- 185 return null;
- 186 }
- 187 }
- 188
- 189 /**////
- 190 /// 取得全部管理员信息
- 191 ///
- 192 ///
管理员实体类集合 - 193 public IList
GetAll() - 194 {
- 195 string SQLCommand = "select * from [TAdmin]";
- 196 try
- 197 {
- 198 OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, null);
- 199 if (!dataReader.HasRows)
- 200 {
- 201 throw new Exception();
- 202 }
- 203
- 204 IList
adminCollection = new List (); - 205 int i = 0;
- 206 while (dataReader.Read())
- 207 {
- 208 AdminInfo admin = new AdminInfo();
- 209 admin.ID = (int)dataReader["ID"];
- 210 admin.Name = (string)dataReader["Name"];
- 211 admin.Password = (string)dataReader["Password"];
- 212
- 213 adminCollection.Add(admin);
- 214 i++;
- 215 }
- 216
- 217 return adminCollection;
- 218 }
- 219 catch
- 220 {
- 221 return null;
- 222 }
- 223 }
- 224 }
- 225}
可以看到,这里主要包括三种类型的操作,一种是修改型,如Insert;一种是返回单个实体类型,如GetByID;还有一种是返回实体类集合型,如GetAll。
MessageDAL和CommentDAL的实现非常相似,在这里不再赘述。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











DDREASE는 하드 드라이브, SSD, RAM 디스크, CD, DVD 및 USB 저장 장치와 같은 파일 또는 블록 장치에서 데이터를 복구하기 위한 도구입니다. 한 블록 장치에서 다른 블록 장치로 데이터를 복사하여 손상된 데이터 블록은 남겨두고 양호한 데이터 블록만 이동합니다. ddreasue는 복구 작업 중에 간섭이 필요하지 않으므로 완전히 자동화된 강력한 복구 도구입니다. 게다가 ddasue 맵 파일 덕분에 언제든지 중지하고 다시 시작할 수 있습니다. DDREASE의 다른 주요 기능은 다음과 같습니다. 복구된 데이터를 덮어쓰지 않지만 반복 복구 시 공백을 채웁니다. 그러나 도구에 명시적으로 지시된 경우에는 잘릴 수 있습니다. 여러 파일이나 블록의 데이터를 단일 파일로 복구

0. 이 글은 어떤 내용을 담고 있나요? 우리는 다재다능하고 빠른 최첨단 생성 단안 깊이 추정 모델인 DepthFM을 제안합니다. DepthFM은 전통적인 깊이 추정 작업 외에도 깊이 인페인팅과 같은 다운스트림 작업에서 최첨단 기능을 보여줍니다. DepthFM은 효율적이며 몇 가지 추론 단계 내에서 깊이 맵을 합성할 수 있습니다. 이 작품을 함께 읽어보아요~ 1. 논문 정보 제목: DepthFM: FastMoncularDepthEstimationwithFlowMatching 저자: MingGui, JohannesS.Fischer, UlrichPrestel, PingchuanMa, Dmytr

Google이 추진하는 JAX의 성능은 최근 벤치마크 테스트에서 Pytorch와 TensorFlow를 능가하여 7개 지표에서 1위를 차지했습니다. 그리고 JAX 성능이 가장 좋은 TPU에서는 테스트가 이루어지지 않았습니다. 개발자들 사이에서는 여전히 Tensorflow보다 Pytorch가 더 인기가 있습니다. 그러나 앞으로는 더 큰 모델이 JAX 플랫폼을 기반으로 훈련되고 실행될 것입니다. 모델 최근 Keras 팀은 기본 PyTorch 구현을 사용하여 세 가지 백엔드(TensorFlow, JAX, PyTorch)와 TensorFlow를 사용하는 Keras2를 벤치마킹했습니다. 첫째, 그들은 주류 세트를 선택합니다.

지연이 발생하고 iPhone의 모바일 데이터 연결 속도가 느립니까? 일반적으로 휴대폰의 셀룰러 인터넷 강도는 지역, 셀룰러 네트워크 유형, 로밍 유형 등과 같은 여러 요소에 따라 달라집니다. 더 빠르고 안정적인 셀룰러 인터넷 연결을 얻기 위해 할 수 있는 일이 몇 가지 있습니다. 수정 1 – iPhone 강제 다시 시작 때로는 장치를 강제로 다시 시작하면 셀룰러 연결을 포함한 많은 항목이 재설정됩니다. 1단계 – 볼륨 높이기 키를 한 번 눌렀다가 놓습니다. 그런 다음 볼륨 작게 키를 눌렀다가 다시 놓습니다. 2단계 - 프로세스의 다음 부분은 오른쪽에 있는 버튼을 누르는 것입니다. iPhone이 다시 시작되도록 하세요. 셀룰러 데이터를 활성화하고 네트워크 속도를 확인하세요. 다시 확인하세요 수정 2 – 데이터 모드 변경 5G는 더 나은 네트워크 속도를 제공하지만 신호가 약할 때 더 잘 작동합니다

세상은 미친 듯이 큰 모델을 만들고 있습니다. 인터넷의 데이터만으로는 충분하지 않습니다. 훈련 모델은 '헝거게임'처럼 생겼고, 전 세계 AI 연구자들은 이러한 데이터를 탐식하는 사람들에게 어떻게 먹이를 줄지 고민하고 있습니다. 이 문제는 다중 모드 작업에서 특히 두드러집니다. 아무것도 할 수 없던 시기에, 중국 인민대학교 학과의 스타트업 팀은 자체 새로운 모델을 사용하여 중국 최초로 '모델 생성 데이터 피드 자체'를 현실화했습니다. 또한 이해 측면과 생성 측면의 두 가지 접근 방식으로 양측 모두 고품질의 다중 모드 새로운 데이터를 생성하고 모델 자체에 데이터 피드백을 제공할 수 있습니다. 모델이란 무엇입니까? Awaker 1.0은 중관촌 포럼에 최근 등장한 대형 멀티모달 모델입니다. 팀은 누구입니까? 소폰 엔진. 런민대학교 힐하우스 인공지능대학원 박사과정 학생인 Gao Yizhao가 설립했습니다.

최근 군계는 미군 전투기가 이제 AI를 활용해 완전 자동 공중전을 완수할 수 있다는 소식에 충격을 받았다. 네, 얼마 전 미군의 AI 전투기가 최초로 공개되면서 그 미스터리가 드러났습니다. 이 전투기의 정식 명칭은 VISTA(Variable Stability Flight Simulator Test Aircraft)로 미 공군 장관이 직접 조종해 일대일 공중전을 모의 실험한 것이다. 5월 2일, 미 공군 장관 프랭크 켄달(Frank Kendall)이 X-62AVISTA를 타고 에드워드 공군 기지에서 이륙했습니다. 1시간의 비행 동안 모든 비행 작업은 AI에 의해 자동으로 완료되었습니다. Kendall은 "지난 수십 년 동안 우리는 자율 공대공 전투의 무한한 잠재력에 대해 생각해 왔지만 항상 도달할 수 없는 것처럼 보였습니다."라고 말했습니다. 그러나 지금은,

이번 주, 오픈AI(OpenAI), 마이크로소프트(Microsoft), 베조스(Bezos), 엔비디아(Nvidia)가 투자한 로봇 회사인 FigureAI는 약 7억 달러의 자금 조달을 받았으며 내년 내에 독립적으로 걸을 수 있는 휴머노이드 로봇을 개발할 계획이라고 발표했습니다. 그리고 Tesla의 Optimus Prime은 계속해서 좋은 소식을 받았습니다. 올해가 휴머노이드 로봇이 폭발하는 해가 될 것이라는 데는 누구도 의심하지 않는다. 캐나다에 본사를 둔 로봇 회사인 SanctuaryAI는 최근 새로운 휴머노이드 로봇인 Phoenix를 출시했습니다. 관계자들은 이 로봇이 인간과 같은 속도로 자율적으로 많은 작업을 완료할 수 있다고 주장한다. 인간의 속도로 자동으로 작업을 완료할 수 있는 세계 최초의 로봇인 Pheonix는 각 물체를 부드럽게 잡고 움직이며 우아하게 왼쪽과 오른쪽에 배치할 수 있습니다. 자동으로 물체를 식별할 수 있습니다.

다중 모드 문서 이해 기능을 위한 새로운 SOTA! Alibaba mPLUG 팀은 최신 오픈 소스 작업인 mPLUG-DocOwl1.5를 출시했습니다. 이 작품은 고해상도 이미지 텍스트 인식, 일반 문서 구조 이해, 지침 따르기, 외부 지식 도입이라는 4가지 주요 과제를 해결하기 위한 일련의 솔루션을 제안했습니다. 더 이상 고민하지 말고 먼저 효과를 살펴보겠습니다. 복잡한 구조의 차트도 한 번의 클릭으로 인식하고 마크다운 형식으로 변환 가능: 다양한 스타일의 차트 사용 가능: 보다 자세한 텍스트 인식 및 위치 지정도 쉽게 처리 가능: 문서 이해에 대한 자세한 설명도 제공 가능: 아시다시피, " 문서 이해"는 현재 대규모 언어 모델 구현을 위한 중요한 시나리오입니다. 시장에는 문서 읽기를 지원하는 많은 제품이 있습니다. 그 중 일부는 주로 텍스트 인식을 위해 OCR 시스템을 사용하고 텍스트 처리를 위해 LLM을 사용합니다.
