基于.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的实现非常相似,在这里不再赘述。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



DDREASE ialah alat untuk memulihkan data daripada fail atau peranti sekat seperti cakera keras, SSD, cakera RAM, CD, DVD dan peranti storan USB. Ia menyalin data dari satu peranti blok ke peranti lain, meninggalkan blok data yang rosak dan hanya memindahkan blok data yang baik. ddreasue ialah alat pemulihan yang berkuasa yang automatik sepenuhnya kerana ia tidak memerlukan sebarang gangguan semasa operasi pemulihan. Selain itu, terima kasih kepada fail peta ddasue, ia boleh dihentikan dan disambung semula pada bila-bila masa. Ciri-ciri utama lain DDREASE adalah seperti berikut: Ia tidak menimpa data yang dipulihkan tetapi mengisi jurang sekiranya pemulihan berulang. Walau bagaimanapun, ia boleh dipotong jika alat itu diarahkan untuk melakukannya secara eksplisit. Pulihkan data daripada berbilang fail atau blok kepada satu

0. Apakah fungsi artikel ini? Kami mencadangkan DepthFM: model anggaran kedalaman monokular generatif yang serba boleh dan pantas. Sebagai tambahan kepada tugas anggaran kedalaman tradisional, DepthFM juga menunjukkan keupayaan terkini dalam tugas hiliran seperti mengecat kedalaman. DepthFM cekap dan boleh mensintesis peta kedalaman dalam beberapa langkah inferens. Mari kita baca karya ini bersama-sama ~ 1. Tajuk maklumat kertas: DepthFM: FastMonocularDepthEstimationwithFlowMatching Pengarang: MingGui, JohannesS.Fischer, UlrichPrestel, PingchuanMa, Dmytr

Prestasi JAX, yang dipromosikan oleh Google, telah mengatasi Pytorch dan TensorFlow dalam ujian penanda aras baru-baru ini, menduduki tempat pertama dalam 7 penunjuk. Dan ujian tidak dilakukan pada TPU dengan prestasi JAX terbaik. Walaupun dalam kalangan pembangun, Pytorch masih lebih popular daripada Tensorflow. Tetapi pada masa hadapan, mungkin lebih banyak model besar akan dilatih dan dijalankan berdasarkan platform JAX. Model Baru-baru ini, pasukan Keras menanda aras tiga hujung belakang (TensorFlow, JAX, PyTorch) dengan pelaksanaan PyTorch asli dan Keras2 dengan TensorFlow. Pertama, mereka memilih satu set arus perdana

Menghadapi ketinggalan, sambungan data mudah alih perlahan pada iPhone? Biasanya, kekuatan internet selular pada telefon anda bergantung pada beberapa faktor seperti rantau, jenis rangkaian selular, jenis perayauan, dsb. Terdapat beberapa perkara yang boleh anda lakukan untuk mendapatkan sambungan Internet selular yang lebih pantas dan boleh dipercayai. Betulkan 1 – Paksa Mulakan Semula iPhone Kadangkala, paksa memulakan semula peranti anda hanya menetapkan semula banyak perkara, termasuk sambungan selular. Langkah 1 – Hanya tekan kekunci naikkan kelantangan sekali dan lepaskan. Seterusnya, tekan kekunci Turun Kelantangan dan lepaskannya semula. Langkah 2 - Bahagian seterusnya proses adalah untuk menahan butang di sebelah kanan. Biarkan iPhone selesai dimulakan semula. Dayakan data selular dan semak kelajuan rangkaian. Semak semula Betulkan 2 – Tukar mod data Walaupun 5G menawarkan kelajuan rangkaian yang lebih baik, ia berfungsi lebih baik apabila isyarat lemah

Saya menangis hingga mati. Dunia sedang membina model besar. Data di Internet tidak mencukupi. Model latihan kelihatan seperti "The Hunger Games", dan penyelidik AI di seluruh dunia bimbang tentang cara memberi makan data ini kepada pemakan yang rakus. Masalah ini amat ketara dalam tugas berbilang modal. Pada masa mereka mengalami kerugian, pasukan pemula dari Jabatan Universiti Renmin China menggunakan model baharu mereka sendiri untuk menjadi yang pertama di China untuk menjadikan "suapan data yang dijana model itu sendiri" menjadi kenyataan. Selain itu, ia merupakan pendekatan serampang dua mata dari segi pemahaman dan sisi penjanaan Kedua-dua pihak boleh menjana data baharu berbilang modal yang berkualiti tinggi dan memberikan maklum balas data kepada model itu sendiri. Apakah model? Awaker 1.0, model berbilang modal besar yang baru sahaja muncul di Forum Zhongguancun. Siapa pasukan itu? Enjin Sophon. Diasaskan oleh Gao Yizhao, pelajar kedoktoran di Sekolah Kecerdasan Buatan Hillhouse Universiti Renmin.

Baru-baru ini, bulatan tentera telah terharu dengan berita: jet pejuang tentera AS kini boleh melengkapkan pertempuran udara automatik sepenuhnya menggunakan AI. Ya, baru-baru ini, jet pejuang AI tentera AS telah didedahkan buat pertama kali, mendedahkan misterinya. Nama penuh pesawat pejuang ini ialah Variable Stability Simulator Test Aircraft (VISTA). Ia diterbangkan sendiri oleh Setiausaha Tentera Udara AS untuk mensimulasikan pertempuran udara satu lawan satu. Pada 2 Mei, Setiausaha Tentera Udara A.S. Frank Kendall berlepas menggunakan X-62AVISTA di Pangkalan Tentera Udara Edwards Ambil perhatian bahawa semasa penerbangan selama satu jam, semua tindakan penerbangan telah diselesaikan secara autonomi oleh AI! Kendall berkata - "Sejak beberapa dekad yang lalu, kami telah memikirkan tentang potensi tanpa had pertempuran udara-ke-udara autonomi, tetapi ia sentiasa kelihatan di luar jangkauan." Namun kini,

Minggu ini, FigureAI, sebuah syarikat robotik yang dilaburkan oleh OpenAI, Microsoft, Bezos, dan Nvidia, mengumumkan bahawa ia telah menerima hampir $700 juta dalam pembiayaan dan merancang untuk membangunkan robot humanoid yang boleh berjalan secara bebas dalam tahun hadapan. Dan Optimus Prime Tesla telah berulang kali menerima berita baik. Tiada siapa yang meragui bahawa tahun ini akan menjadi tahun apabila robot humanoid meletup. SanctuaryAI, sebuah syarikat robotik yang berpangkalan di Kanada, baru-baru ini mengeluarkan robot humanoid baharu, Phoenix. Pegawai mendakwa bahawa ia boleh menyelesaikan banyak tugas secara autonomi pada kelajuan yang sama seperti manusia. Pheonix, robot pertama di dunia yang boleh menyelesaikan tugas secara autonomi pada kelajuan manusia, boleh mencengkam, menggerakkan dan meletakkan setiap objek secara elegan di sisi kiri dan kanannya dengan perlahan. Ia boleh mengenal pasti objek secara autonomi

SOTA baharu untuk keupayaan memahami dokumen multimodal! Pasukan Alibaba mPLUG mengeluarkan kerja sumber terbuka terkini mPLUG-DocOwl1.5, yang mencadangkan satu siri penyelesaian untuk menangani empat cabaran utama pengecaman teks imej resolusi tinggi, pemahaman struktur dokumen am, arahan mengikut dan pengenalan pengetahuan luaran. Tanpa berlengah lagi, mari kita lihat kesannya dahulu. Pengecaman satu klik dan penukaran carta dengan struktur kompleks ke dalam format Markdown: Carta gaya berbeza tersedia: Pengecaman dan kedudukan teks yang lebih terperinci juga boleh dikendalikan dengan mudah: Penjelasan terperinci tentang pemahaman dokumen juga boleh diberikan: Anda tahu, "Pemahaman Dokumen " pada masa ini Senario penting untuk pelaksanaan model bahasa yang besar. Terdapat banyak produk di pasaran untuk membantu pembacaan dokumen. Sesetengah daripada mereka menggunakan sistem OCR untuk pengecaman teks dan bekerjasama dengan LLM untuk pemprosesan teks.
