ホームページ データベース mysql チュートリアル 基于.NET平台的分层架构实战(七)数据访问层的第一种实现:A

基于.NET平台的分层架构实战(七)数据访问层的第一种实现:A

Jun 07, 2016 pm 03:37 PM
.net 層状の に基づく 実戦 プラットホーム データ 建築 アクセス

经过上面篇文章的介绍,整个系统的 框架 算是基本搭建完了,下面,我们要具体 实现 各个层次。关于 数据 访问 层的 实现 ,我准备讨论三种 实现 方式,这一篇文章讨论 第一 种: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

  1. 1using System;
  2. 2using System.Web;
  3. 3using System.Web.Caching;
  4. 4using System.Configuration;
  5. 5using System.Data;
  6. 6using System.Data.OleDb;
  7. 7using NGuestBook.Utility;
  8. 8
  9. 9namespace NGuestBook.AccessDAL
  10. 10{
  11. 11    /**////
  12. 12    /// Access数据库操作助手
  13. 13    ///
  14. 14    public sealed class AccessDALHelper
  15. 15    {
  16. 16        /**////
  17. 17        /// 读取Access数据库的连接字符串
  18. 18        /// 首先从缓存里读取,如果不存在则到配置文件中读取,并放入缓存
  19. 19        ///
  20. 20        /// Access数据库的连接字符串
  21. 21        private static string GetConnectionString()
  22. 22        {
  23. 23            if (CacheAccess.GetFromCache("AccessConnectionString") != null)
  24. 24            {
  25. 25                return CacheAccess.GetFromCache("AccessConnectionString").ToString();
  26. 26            }
  27. 27            else
  28. 28            {
  29. 29                string dbPath = ConfigurationManager.AppSettings["AccessPath"];
  30. 30                string dbAbsolutePath = HttpContext.Current.Server.MapPath(dbPath);
  31. 31                string connectionString = ConfigurationManager.AppSettings["AccessConnectionString"];
  32. 32
  33. 33                CacheDependency fileDependency = new CacheDependency(HttpContext.Current.Server.MapPath("Web.Config"));
  34. 34                CacheAccess.SaveToCache("AccessConnectionString", connectionString.Replace("{DBPath}", dbAbsolutePath), fileDependency);
  35. 35
  36. 36                return connectionString.Replace("{DBPath}", dbAbsolutePath);
  37. 37            }
  38. 38        }
  39. 39
  40. 40        /**////
  41. 41        /// 执行SQL语句并且不返回任何值
  42. 42        ///
  43. 43        /// 所执行的SQL命令
  44. 44        /// 参数集合
  45. 45        public static void ExecuteSQLNonQuery(string SQLCommand,OleDbParameter[] parameters)
  46. 46        {
  47. 47            OleDbConnection connection = new OleDbConnection(GetConnectionString());
  48. 48            OleDbCommand command = new OleDbCommand(SQLCommand, connection);
  49. 49
  50. 50            for (int i = 0; i
  51. 51            {
  52. 52                command.Parameters.Add(parameters);
  53. 53            }
  54. 54
  55. 55            connection.Open();
  56. 56            command.ExecuteNonQuery();
  57. 57            connection.Close();
  58. 58        }
  59. 59
  60. 60        /**////
  61. 61        /// 执行SQL语句并返回包含查询结果的DataReader
  62. 62        ///
  63. 63        /// 所执行的SQL命令
  64. 64        /// 参数集合
  65. 65        ///
  66. 66        public static OleDbDataReader ExecuteSQLDataReader(string SQLCommand,OleDbParameter[] parameters)
  67. 67        {
  68. 68            OleDbConnection connection = new OleDbConnection(GetConnectionString());
  69. 69            OleDbCommand command = new OleDbCommand(SQLCommand, connection);
  70. 70
  71. 71            for (int i = 0; i
  72. 72            {
  73. 73                command.Parameters.Add(parameters);
  74. 74            }
  75. 75
  76. 76            connection.Open();
  77. 77            OleDbDataReader dataReader = command.ExecuteReader();
  78. 78            //connection.Close();
  79. 79
  80. 80            return dataReader;
  81. 81        }
  82. 82    }
  83. 83}
复制代码

2.实现具体的数据访问操作类
      因为前面已经定义了数据访问接口,所以实现数据访问操作类就是很机械的工作了。下面仅以Admin的数据访问操作类为例:

AdminDAL:

AdminDAL

  1.   1using System;
  2.   2using System.Collections.Generic;
  3.   3using System.Text;
  4.   4using System.Data;
  5.   5using System.Data.OleDb;
  6.   6using NGuestBook.IDAL;
  7.   7using NGuestBook.Entity;
  8.   8
  9.   9namespace NGuestBook.AccessDAL
  10. 10{
  11. 11    public class AdminDAL : IAdminDAL
  12. 12    {
  13. 13        /**////
  14. 14        /// 插入管理员
  15. 15        ///
  16. 16        /// 管理员实体类
  17. 17        /// 是否成功
  18. 18        public bool Insert(AdminInfo admin)
  19. 19        {
  20. 20            string SQLCommand = "insert into [TAdmin]([Name],[Password]) values(@name,@password)";
  21. 21            OleDbParameter[] parameters ={
  22. 22                new OleDbParameter("name",admin.Name),
  23. 23                new OleDbParameter("password",admin.Password)
  24. 24            };
  25. 25
  26. 26            try
  27. 27            {
  28. 28                AccessDALHelper.ExecuteSQLNonQuery(SQLCommand, parameters);
  29. 29                return true;
  30. 30            }
  31. 31            catch
  32. 32            {
  33. 33                return false;
  34. 34            }
  35. 35        }
  36. 36
  37. 37        /**////
  38. 38        /// 删除管理员
  39. 39        ///
  40. 40        /// 欲删除的管理员的ID
  41. 41        /// 是否成功
  42. 42        public bool Delete(int id)
  43. 43        {
  44. 44            string SQLCommand = "delete from [TAdmin] where [ID]=@id";
  45. 45            OleDbParameter[] parameters ={
  46. 46                new OleDbParameter("id",id)
  47. 47            };
  48. 48
  49. 49            try
  50. 50            {
  51. 51                AccessDALHelper.ExecuteSQLNonQuery(SQLCommand, parameters);
  52. 52                return true;
  53. 53            }
  54. 54            catch
  55. 55            {
  56. 56                return false;
  57. 57            }
  58. 58        }
  59. 59
  60. 60        /**////
  61. 61        /// 更新管理员信息
  62. 62        ///
  63. 63        /// 管理员实体类
  64. 64        /// 是否成功
  65. 65        public bool Update(AdminInfo admin)
  66. 66        {
  67. 67            string SQLCommand = "update [TAdmin] set [Name]=@name,[Password]=@password where [ID]=@id";
  68. 68            OleDbParameter[] parameters ={
  69. 69                new OleDbParameter("id",admin.ID),
  70. 70                new OleDbParameter("name",admin.Name),
  71. 71                new OleDbParameter("password",admin.Password)
  72. 72            };
  73. 73
  74. 74            try
  75. 75            {
  76. 76                AccessDALHelper.ExecuteSQLNonQuery(SQLCommand, parameters);
  77. 77                return true;
  78. 78            }
  79. 79            catch
  80. 80            {
  81. 81                return false;
  82. 82            }
  83. 83        }
  84. 84
  85. 85        /**////
  86. 86        /// 按ID取得管理员信息
  87. 87        ///
  88. 88        /// 管理员ID
  89. 89        /// 管理员实体类
  90. 90        public AdminInfo GetByID(int id)
  91. 91        {
  92. 92            string SQLCommand = "select * from [TAdmin] where [ID]=@id";
  93. 93            OleDbParameter[] parameters ={
  94. 94                new OleDbParameter("id",id)
  95. 95            };
  96. 96
  97. 97            try
  98. 98            {
  99. 99                OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, parameters);
  100. 100                if (!dataReader.HasRows)
  101. 101                {
  102. 102                    throw new Exception();
  103. 103                }
  104. 104
  105. 105                AdminInfo admin = new AdminInfo();
  106. 106                dataReader.Read();
  107. 107                admin.ID=(int)dataReader["ID"];
  108. 108                admin.Name=(string)dataReader["Name"];
  109. 109                admin.Password=(string)dataReader["Password"];
  110. 110
  111. 111                return admin;
  112. 112            }
  113. 113            catch
  114. 114            {
  115. 115                return null;
  116. 116            }
  117. 117        }
  118. 118
  119. 119        /**////
  120. 120        /// 按用户名及密码取得管理员信息
  121. 121        ///
  122. 122        /// 用户名
  123. 123        /// 密码
  124. 124        /// 管理员实体类,不存在时返回null
  125. 125        public AdminInfo GetByNameAndPassword(string name, string password)
  126. 126        {
  127. 127            string SQLCommand = "select * from [TAdmin] where [Name]=@name and [Password]=@password";
  128. 128            OleDbParameter[] parameters ={
  129. 129                new OleDbParameter("name",name),
  130. 130                new OleDbParameter("password",password),
  131. 131            };
  132. 132
  133. 133            try
  134. 134            {
  135. 135                OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, parameters);
  136. 136                if (!dataReader.HasRows)
  137. 137                {
  138. 138                    throw new Exception();
  139. 139                }
  140. 140
  141. 141                AdminInfo admin = new AdminInfo();
  142. 142                dataReader.Read();
  143. 143                admin.ID = (int)dataReader["ID"];
  144. 144                admin.Name = (string)dataReader["Name"];
  145. 145                admin.Password = (string)dataReader["Password"];
  146. 146
  147. 147                return admin;
  148. 148            }
  149. 149            catch
  150. 150            {
  151. 151                return null;
  152. 152            }
  153. 153        }
  154. 154
  155. 155        /**////
  156. 156        /// 按管理员名取得管理员信息
  157. 157        ///
  158. 158        /// 管理员名
  159. 159        /// 管理员实体类
  160. 160        public AdminInfo GetByName(string name)
  161. 161        {
  162. 162            string SQLCommand = "select * from [TAdmin] where [Name]=@name";
  163. 163            OleDbParameter[] parameters ={
  164. 164                new OleDbParameter("name",name),
  165. 165            };
  166. 166
  167. 167            try
  168. 168            {
  169. 169                OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, parameters);
  170. 170                if (!dataReader.HasRows)
  171. 171                {
  172. 172                    throw new Exception();
  173. 173                }
  174. 174
  175. 175                AdminInfo admin = new AdminInfo();
  176. 176                dataReader.Read();
  177. 177                admin.ID = (int)dataReader["ID"];
  178. 178                admin.Name = (string)dataReader["Name"];
  179. 179                admin.Password = (string)dataReader["Password"];
  180. 180
  181. 181                return admin;
  182. 182            }
  183. 183            catch
  184. 184            {
  185. 185                return null;
  186. 186            }
  187. 187        }
  188. 188
  189. 189        /**////
  190. 190        /// 取得全部管理员信息
  191. 191        ///
  192. 192        /// 管理员实体类集合
  193. 193        public IList GetAll()
  194. 194        {
  195. 195            string SQLCommand = "select * from [TAdmin]";
  196. 196            try
  197. 197            {
  198. 198                OleDbDataReader dataReader = AccessDALHelper.ExecuteSQLDataReader(SQLCommand, null);
  199. 199                if (!dataReader.HasRows)
  200. 200                {
  201. 201                    throw new Exception();
  202. 202                }
  203. 203
  204. 204                IList adminCollection = new List();
  205. 205                int i = 0;
  206. 206                while (dataReader.Read())
  207. 207                {
  208. 208                    AdminInfo admin = new AdminInfo();
  209. 209                    admin.ID = (int)dataReader["ID"];
  210. 210                    admin.Name = (string)dataReader["Name"];
  211. 211                    admin.Password = (string)dataReader["Password"];
  212. 212
  213. 213                    adminCollection.Add(admin);
  214. 214                    i++;
  215. 215                }
  216. 216
  217. 217                return adminCollection;
  218. 218            }
  219. 219            catch
  220. 220            {
  221. 221                return null;
  222. 222            }
  223. 223        }
  224. 224    }
  225. 225}
复制代码

可以看到,这里主要包括三种类型的操作,一种是修改型,如Insert;一种是返回单个实体类型,如GetByID;还有一种是返回实体类集合型,如GetAll。
      MessageDAL和CommentDAL的实现非常相似,在这里不再赘述。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

オープンソース!ゾーイデプスを超えて! DepthFM: 高速かつ正確な単眼深度推定! オープンソース!ゾーイデプスを超えて! DepthFM: 高速かつ正確な単眼深度推定! Apr 03, 2024 pm 12:04 PM

0.この記事は何をするのですか?私たちは、多用途かつ高速な最先端の生成単眼深度推定モデルである DepthFM を提案します。従来の深度推定タスクに加えて、DepthFM は深度修復などの下流タスクでも最先端の機能を実証します。 DepthFM は効率的で、いくつかの推論ステップ内で深度マップを合成できます。この作品について一緒に読みましょう〜 1. 論文情報タイトル: DepthFM: FastMonocularDepthEstimationwithFlowMatching 著者: MingGui、JohannesS.Fischer、UlrichPrestel、PingchuanMa、Dmytr

Google は大喜び: JAX のパフォーマンスが Pytorch や TensorFlow を上回りました! GPU 推論トレーニングの最速の選択肢となる可能性があります Google は大喜び: JAX のパフォーマンスが Pytorch や TensorFlow を上回りました! GPU 推論トレーニングの最速の選択肢となる可能性があります Apr 01, 2024 pm 07:46 PM

Google が推進する JAX のパフォーマンスは、最近のベンチマーク テストで Pytorch や TensorFlow のパフォーマンスを上回り、7 つの指標で 1 位にランクされました。また、テストは最高の JAX パフォーマンスを備えた TPU では行われませんでした。ただし、開発者の間では、依然として Tensorflow よりも Pytorch の方が人気があります。しかし、将来的には、おそらくより大規模なモデルが JAX プラットフォームに基づいてトレーニングされ、実行されるようになるでしょう。モデル 最近、Keras チームは、ネイティブ PyTorch 実装を使用して 3 つのバックエンド (TensorFlow、JAX、PyTorch) をベンチマークし、TensorFlow を使用して Keras2 をベンチマークしました。まず、主流のセットを選択します

iPhoneのセルラーデータインターネット速度が遅い:修正 iPhoneのセルラーデータインターネット速度が遅い:修正 May 03, 2024 pm 09:01 PM

iPhone のモバイル データ接続に遅延や遅い問題が発生していませんか?通常、携帯電話の携帯インターネットの強度は、地域、携帯ネットワークの種類、ローミングの種類などのいくつかの要因によって異なります。より高速で信頼性の高いセルラー インターネット接続を実現するためにできることがいくつかあります。解決策 1 – iPhone を強制的に再起動する 場合によっては、デバイスを強制的に再起動すると、携帯電話接続を含む多くの機能がリセットされるだけです。ステップ 1 – 音量を上げるキーを 1 回押して放します。次に、音量小キーを押して、もう一度放します。ステップ 2 – プロセスの次の部分は、右側のボタンを押し続けることです。 iPhone の再起動が完了するまで待ちます。セルラーデータを有効にし、ネットワーク速度を確認します。もう一度確認してください 修正 2 – データ モードを変更する 5G はより優れたネットワーク速度を提供しますが、信号が弱い場合はより適切に機能します

テスラのロボットは工場で働く、マスク氏:手の自由度は今年22に達する! テスラのロボットは工場で働く、マスク氏:手の自由度は今年22に達する! May 06, 2024 pm 04:13 PM

テスラのロボット「オプティマス」の最新映像が公開され、すでに工場内で稼働可能となっている。通常の速度では、バッテリー(テスラの4680バッテリー)を次のように分類します:公式は、20倍の速度でどのように見えるかも公開しました - 小さな「ワークステーション」上で、ピッキング、ピッキング、ピッキング:今回は、それがリリースされたハイライトの1つビデオの内容は、オプティマスが工場内でこの作業を完全に自律的に行​​い、プロセス全体を通じて人間の介入なしに完了するというものです。そして、オプティマスの観点から見ると、自動エラー修正に重点を置いて、曲がったバッテリーを拾い上げたり配置したりすることもできます。オプティマスのハンドについては、NVIDIA の科学者ジム ファン氏が高く評価しました。オプティマスのハンドは、世界の 5 本指ロボットの 1 つです。最も器用。その手は触覚だけではありません

超知性の生命力が覚醒する!しかし、自己更新 AI の登場により、母親はデータのボトルネックを心配する必要がなくなりました。 超知性の生命力が覚醒する!しかし、自己更新 AI の登場により、母親はデータのボトルネックを心配する必要がなくなりました。 Apr 29, 2024 pm 06:55 PM

世界は狂ったように大きなモデルを構築していますが、インターネット上のデータだけではまったく不十分です。このトレーニング モデルは「ハンガー ゲーム」のようであり、世界中の AI 研究者は、データを貪欲に食べる人たちにどのように餌を与えるかを心配しています。この問題は、マルチモーダル タスクで特に顕著です。何もできなかった当時、中国人民大学学部のスタートアップチームは、独自の新しいモデルを使用して、中国で初めて「モデル生成データフィード自体」を実現しました。さらに、これは理解側と生成側の 2 つの側面からのアプローチであり、両方の側で高品質のマルチモーダルな新しいデータを生成し、モデル自体にデータのフィードバックを提供できます。モデルとは何ですか? Awaker 1.0 は、中関村フォーラムに登場したばかりの大型マルチモーダル モデルです。チームは誰ですか?ソフォンエンジン。人民大学ヒルハウス人工知能大学院の博士課程学生、ガオ・イージャオ氏によって設立されました。

Alibaba 7B マルチモーダル文書理解の大規模モデルが新しい SOTA を獲得 Alibaba 7B マルチモーダル文書理解の大規模モデルが新しい SOTA を獲得 Apr 02, 2024 am 11:31 AM

マルチモーダル文書理解機能のための新しい SOTA!アリババの mPLUG チームは、最新のオープンソース作品 mPLUG-DocOwl1.5 をリリースしました。これは、高解像度の画像テキスト認識、一般的な文書構造の理解、指示の遵守、外部知識の導入という 4 つの主要な課題に対処するための一連のソリューションを提案しています。さっそく、その効果を見てみましょう。複雑な構造のグラフをワンクリックで認識しMarkdown形式に変換:さまざまなスタイルのグラフが利用可能:より詳細な文字認識や位置決めも簡単に対応:文書理解の詳しい説明も可能:ご存知「文書理解」 「」は現在、大規模な言語モデルの実装にとって重要なシナリオです。市場には文書の読み取りを支援する多くの製品が存在します。その中には、主にテキスト認識に OCR システムを使用し、テキスト処理に LLM と連携する製品もあります。

Llama 70B を実行するシングル カードはデュアル カードより高速、Microsoft は FP6 を A100 オープンソースに強制導入 Llama 70B を実行するシングル カードはデュアル カードより高速、Microsoft は FP6 を A100 オープンソースに強制導入 Apr 29, 2024 pm 04:55 PM

FP8 以下の浮動小数点数値化精度は、もはや H100 の「特許」ではありません。 Lao Huang は誰もが INT8/INT4 を使用できるようにしたいと考え、Microsoft DeepSpeed チームは NVIDIA からの公式サポートなしで A100 上で FP6 の実行を開始しました。テスト結果は、A100 での新しい方式 TC-FPx の FP6 量子化が INT4 に近いか、場合によってはそれよりも高速であり、後者よりも精度が高いことを示しています。これに加えて、エンドツーエンドの大規模モデルのサポートもあり、オープンソース化され、DeepSpeed などの深層学習推論フレームワークに統合されています。この結果は、大規模モデルの高速化にも即座に影響します。このフレームワークでは、シングル カードを使用して Llama を実行すると、スループットはデュアル カードのスループットの 2.65 倍になります。 1つ

Spring Data JPA のアーキテクチャと動作原理は何ですか? Spring Data JPA のアーキテクチャと動作原理は何ですか? Apr 17, 2024 pm 02:48 PM

SpringDataJPA は JPA アーキテクチャに基づいており、マッピング、ORM、トランザクション管理を通じてデータベースと対話します。そのリポジトリは CRUD 操作を提供し、派生クエリによりデータベース アクセスが簡素化されます。さらに、遅延読み込みを使用して必要な場合にのみデータを取得するため、パフォーマンスが向上します。

See all articles