1。什么是SQLHelperSqlHelper是基于.NET Framework开发的数据库操作组件主要通过封装ADO.NET对象如SqlConnection、SqlCommand简化数据库访问流程。该组件通过静态方法提供统一的数据访问模式支持传入连接字符串和SQL参数快速执行数据库交互。解读SQLHelperhttps://blog.csdn.net/weixin_66547608/article/details/150936831原版下载https://www.cnblogs.com/dnawo/archive/2012/08/14/2638401.html中文注释版下载https://www.cnblogs.com/gb2013/archive/2009/12/20/1628013.html2。N层框架N层框架核心层Model层模型层实体层主要负责对数据库中的对象表视图存储过程等做映射把数据库中的对象转化成C#语言中的类对象将来在C#项目中使用类对象就相当于使用了数据库中的对象。 映射ORM 对象关系映射 Object Relation MappingIDAL接口层负责抽象DAL层中的共性。将来不同的数据库都可以实现这个共性达到一个项目使用多个数据库的目的可以方便的切换数据库。DAL数据访问层主要负责和数据库交互。SQLServerDAL负责和SQLServer数据库交互OracleDAL负责和Oracle数据库交互。DALFactory抽象工厂层主要负责DAL的创建实例化。根据各种数据库的DAL都必须实现某种接口IDAL才可以让抽象工厂层根据配置文件创建不同数据库实现的DAL。有了抽象工厂层可以让BLL不再强依赖DAL达到解耦的目的。BLL业务逻辑层主要负责对数据库交互即DAL层封装以及对UI校验逻辑的封装。UI层将来直接使用BLL层UI不使用DAL。UI层WindowForm项目来实现UI层UI层依赖BLL,Model,DAL以下两层是工具层不是核心层Common层公共层一般把一个“小工具”封装到这一层中供其他层使用。也可以称为“助手层”DBUtility层数据库工具层N层框架依赖关系Model不依赖任何层IDAL依赖ModelSQLServerDAL依赖IDALModelUtilityDALFactory依赖UtilityBLL依赖IDAL,DALFactory,ModelUI依赖BLL,Model,SQLServerDAL3。回顾一下ADO.NET六大对象a.SqlConnectionb.SqlCommand 对象重要的属性CommandTypeCommandTextParametersSqlCommand 重要的方法ExecuteNoQuery()ExecuteReader()ExecuteScalar()c.SqlDataReaderd.SqlDataAdaptere.DataSetf.SqlParameter一、连接式操作核心全程依赖数据库连接1. Connection 数据库连接对象✅ 一句话定位所有数据库操作的基础负责建立应用和数据库的物理连接✅ 核心重点核心配置ConnectionString连接字符串存储数据库地址、账号、库名、连接超时等信息关键操作Open()打开连接、Close()关闭连接必守规则连接是稀缺资源用完必须及时释放推荐用using语法自动释放ADO.NET默认启用连接池复用连接不主动释放会导致资源耗尽2. Command SQL 命令执行对象✅ 一句话定位向数据库发送 SQL 语句、存储过程的载体✅ 核心重点核心配置CommandText要执行的 SQL / 存储过程名、Parameters参数集合用于参数化查询是防范 SQL 注入的核心手段三个执行方法对应完全不同的场景ExecuteNonQuery()执行增删改操作返回受影响的行数ExecuteScalar()执行查询返回结果集第一行第一列的值适合查COUNT、SUM这类单值结果ExecuteReader()执行查询返回数据流对象DataReader3. DataReader 数据读取器✅ 一句话定位高性能、低内存占用的只读数据遍历工具✅ 核心重点特点全程需要保持连接打开只能按顺序向前遍历、只读不能改内存开销极小读取速度极快适用场景只需要快速遍历查询结果、不需要修改数据的场景比如查询大量列表数据注意用完必须立即关闭否则会一直占用连接4. Transaction 事务对象✅ 一句话定位保证多步数据库操作的原子性要么全部成功要么全部回滚✅ 核心重点使用流程Connection.BeginTransaction()开启事务 → 所有待执行的Command都绑定到该事务 → 所有操作成功调用Commit()提交 → 出现异常调用Rollback()回滚所有操作适用场景转账、订单生成这类需要多步操作强一致的场景二、离线式操作核心可断开数据库连接操作内存数据5. DataAdapter 数据适配器✅ 一句话定位连接数据库和离线数据集的「桥梁」✅ 核心重点内置 4 个 Command 对应 4 类操作SelectCommand查询、InsertCommand新增、UpdateCommand修改、DeleteCommand删除两个核心方法Fill()自动管理连接生命周期把数据库数据拉取填充到DataSet/DataTable不需要手动打开 / 关闭连接Update()把离线数据集里的修改批量同步回数据库效率技巧单表操作场景可以搭配CommandBuilder自动生成增删改 SQL不需要手动编写6. DataSet 数据集✅ 一句话定位内存中的「微型数据库」完全离线独立运行✅ 核心重点特点不需要依赖数据库连接内部可以存储多张DataTable数据表支持定义表间关联、主键、约束支持对数据做增删改查、过滤、排序还可以和 XML 互相转换适用场景需要离线修改数据、多表关联操作、跨层传输数据的场景轻量化替代如果只操作单张表可直接用更轻量的DataTable4。SQLHelper助手有两个版本官方方法少代码量少开发者扩展的带中文注释重载方法多。虽然多主要方法就四个重要方法a. ExectuteDataset()返回一个DataSet() FillDataset()没有返回值但可以填充DataSet参数。b. ExecuteNoQuery()返回影响的行数c. ExectuteReader()返回DataReader,循环获取数据d. ExecuteScalar()返回第一行第一列的值5。Sql分页方案https://blog.csdn.net/zls365365/article/details/128739389https://cloud.tencent.com/developer/article/2037986https://blog.csdn.net/weixin_37610397/article/details/80892426推荐两种方案sqlserver2012至今 推荐使用offset/fetch nextsqlserver2005至sqlserver2012 之间推荐使用row_number方案其他方案涉及嵌套查询性能低不推荐。1.分页方案1--分页方案1最推荐方案是目前最好的方案。 select * from College order by CollegeId offset 0 rows fetch next 2 rows only; --offset偏移量 --偏移量公式(page-1)*pageSize declare page int -- 页码第几页 declare pageSize int --每页显示几条数据 set page4 set pageSize2 select * from College order by CollegeId offset (page-1)*pageSize rows fetch next pageSize rows only;2.分页方案2declare page int declare pageSize int declare startIndex int; declare endIndex int; set page1 set pageSize2 /* startindex (page - 1) * pageSize 1 endindex page*pageSize page1, startindex1, endindex2 page2, startindex3, endindex4 page3, startindex5, endindex6 page4, startindex7, endindex8 startIndex pageSize*page-1 endindex pageSize*page */ set startIndex (page-1)*pageSize1 set endIndex page*pageSize ;with MyData (RowNum, CollegeId, CollegeName, Status, CreateUserId, CreateTime, LastUpdateUserId, LastUpdateTime) as ( select row_number() over(order by CollegeId asc) as RowNum,* from College ) select * from MyData where RowNum startIndex and RowNumendIndex3.分页方案2的旧写法declare page int declare pageSize int declare startIndex int; declare endIndex int; set page1 set pageSize2 /* startindex (page - 1) * pageSize 1 endindex page*pageSize page1, startindex1, endindex4 page2, startindex5, endindex8 startIndex pageSize*page-1 endindex pageSize*page */ set startIndex (page - 1) * pageSize 1 set endIndex page*pageSize select * from ( select row_number() over(order by CollegeId asc) as RowNum,* from College ) as tmp where RowNum startIndex and RowNumendIndex6。C# 加密及解密加密算法根据当前密码学领域的通用分类标准加密算法主要分为三大类对称加密算法、非对称加密算法和哈希算法散列函数。这三类算法在原理、密钥使用方式和应用场景上有着本质区别共同构成了现代信息安全的基础。C#中常用的加密算法DES,AES,RSA,MD5这几种。对称加密算法对称加密算法也称为私钥加密算法其核心特征是加密和解密使用同一把密钥或可相互推导的等价密钥。这类算法的优点是加解密速度快、效率高适合对大量数据进行加密处理。主要特点算法公开计算量小加密效率高。其安全性完全依赖于密钥的保密性密钥需要在通信双方之间安全共享这是其主要挑战。常见算法DES(Data Encryption Standard)早期的数据加密标准使用56位密钥因密钥过短已被认为不安全逐渐被淘汰。3DES(Triple DES)DES的增强版对数据块进行三次加密安全性提高但处理速度较慢。AES(Advanced Encryption Standard)目前最流行、最安全的对称加密标准用于替代DES。它支持128、192和256位等多种密钥长度在软硬件上都能快速实现。百科其他算法还包括IDEA、RC系列以及中国的SM4国家标准算法等。非对称加密算法非对称加密算法也称为公钥加密算法它使用一对数学上关联的密钥公钥和私钥。公钥可以公开用于加密或验证签名私钥必须保密用于解密或生成签名。非对称加密解决了对称加密中密钥分发难的问题但加解密速度通常比对称加密慢得多。主要特点无需事先共享密钥解决了密钥分发问题常用于数字签名、身份认证和密钥协商。其安全性基于复杂的数学难题如大整数分解、椭圆曲线离散对数。常见算法RSA最经典和广泛应用的非对称算法安全性基于大整数质因数分解的难度。可用于加密和数字签名。ECC(椭圆曲线密码学)相比RSA在相同安全强度下所需密钥长度更短、处理速度更快、存储空间更小特别适用于移动设备等资源受限环境。DSA(数字签名算法)主要用于数字签名不用于加密。中国的SM2椭圆曲线公钥密码算法也是重要的非对称加密标准。哈希算法Hash哈希算法又称散列函数或摘要算法是一种单向加密算法。它将任意长度的输入数据映射为固定长度的输出哈希值且过程不可逆。哈希算法主要用于验证数据的完整性确保信息在传输过程中未被篡改。主要特点单向性不可逆、抗碰撞性难以找到两个不同输入产生相同输出、雪崩效应输入微小改变导致输出巨大差异。它不需要密钥但存在带密钥的变种如HMAC。主要用途密码存储、数字签名、数据完整性校验。常见算法MD5产生128位哈希值但已被证实存在碰撞漏洞不再推荐用于安全目的。百科SHA系列如SHA-1、SHA-256等。SHA-1也已发现弱点目前SHA-256等更安全的版本被广泛推荐使用。加密算法主要分为三大类对称加密算法、非对称加密算法和哈希算法散列函数。C#中常用的加密算法DES,AES,RSA,MD5这几种。对称加密算法也称为私钥加密算法其核心特征是加密和解密使用同一把密钥。 DES,AES非对称加密算法也称为公钥加密算法它使用一对数学上关联的密钥公钥和私钥。RAS哈希算法又称散列函数或摘要算法是一种单向加密算法。MD5https://blog.csdn.net/weixin_42113456/article/details/151583486https://www.cnblogs.com/suqq/p/13150546.htmlhttps://blog.51cto.com/u_11566683/6045656?using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Utility.Encrypt; namespace UI { public partial class Form2 : Form { string key1 12345678; // 必须是8字节 string key2 12345678901234567890123456789012; // 必须是32字节 RSA rsa RSA.Create(); public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // DES加密 if (radioButton1.Checked) { textBox2.Text DESHelper.Encrypt(textBox1.Text, key1); } // AES加密 if (radioButton2.Checked) { textBox2.Text AESHelper.Encrypt(textBox1.Text, key2); } // RSA加密 if (radioButton3.Checked) { // 产生加密使用的公钥 string publicKey rsa.ToXmlString(false); // false 表示仅导出公钥 textBox2.Text RSAHelper.Encrypt(textBox1.Text, publicKey); } // MD5加密 if (radioButton4.Checked) { textBox2.Text MD5Helper.Encrypt(textBox1.Text); } } private void button2_Click(object sender, EventArgs e) { // DES解密 if (radioButton1.Checked) { textBox1.Text DESHelper.Decrypt(textBox2.Text, key1); } // AES解密 if (radioButton2.Checked) { textBox1.Text AESHelper.Decrypt(textBox2.Text, key2); } // RSA解密 if (radioButton3.Checked) { // 产生解密使用的私钥 string privateKey rsa.ToXmlString(true); // true 表示导出私钥 textBox1.Text RSAHelper.Decrypt(textBox2.Text, privateKey); } // MD5解密 if (radioButton4.Checked) { MessageBox.Show(MD5无法解密只能暴力破解); } } private void button3_Click(object sender, EventArgs e) { string mw MD5Helper.Encrypt(textBox3.Text); if (mw textBox2.Text) { MessageBox.Show(猜对了); } else { MessageBox.Show(猜错了); } } } }using System; using System.Security.Cryptography; using System.Text; namespace Utility.Encrypt { public static class AESHelper { private static string iv 1234567890123456; // 必须是16字节 /// summary /// 加密 /// /summary /// param nameplainText明文/param /// param namekey密钥/param /// returns密文/returns public static string Encrypt(string plainText, string key) { // 创建AES对象(也是加密服务提供者) using (Aes aes Aes.Create()) { // 给加密服务提供者设置一些参数 aes.Key Encoding.UTF8.GetBytes(key); aes.IV Encoding.UTF8.GetBytes(iv); aes.Mode CipherMode.CBC; aes.Padding PaddingMode.PKCS7; // 创建加密者 ICryptoTransform encryptor aes.CreateEncryptor(aes.Key, aes.IV); byte[] inputBytes Encoding.UTF8.GetBytes(plainText); byte[] encryptedBytes encryptor.TransformFinalBlock(inputBytes, 0, inputBytes.Length); return Convert.ToBase64String(encryptedBytes); } } /// summary /// 解密 /// /summary /// param namecipherText密文/param /// param namekey密钥/param /// returns明文/returns public static string Decrypt(string cipherText, string key) { using (Aes aes Aes.Create()) { aes.Key Encoding.UTF8.GetBytes(key); aes.IV Encoding.UTF8.GetBytes(iv); aes.Mode CipherMode.CBC; aes.Padding PaddingMode.PKCS7; ICryptoTransform decryptor aes.CreateDecryptor(aes.Key, aes.IV); byte[] cipherBytes Convert.FromBase64String(cipherText); byte[] decryptedBytes decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length); return Encoding.UTF8.GetString(decryptedBytes); } } } }using System; using System.Security.Cryptography; using System.Text; namespace Utility.Encrypt { /// summary /// DES加密解密 /// /summary public static class DESHelper { private static string iv abcd6666; // 初始化向量8字节必须是8个字节 /// summary /// 加密 /// /summary /// param nameplainText纯文本明文/param /// param namekey密钥8字节/param /// returns密文/returns public static string Encrypt(string plainText, string key) { // DESCryptoServiceProvider类是 DES加密服务的提供者 using (DESCryptoServiceProvider des new DESCryptoServiceProvider()) { // 给加密服务提供密钥和初始化向量 des.Key Encoding.UTF8.GetBytes(key); des.IV Encoding.UTF8.GetBytes(iv); // 加密者 ICryptoTransform encryptor des.CreateEncryptor(des.Key, des.IV); // 先把明文编码转换UTF8编码的字节数组。 byte[] plainBytes Encoding.UTF8.GetBytes(plainText); // TransformFinalBlock()把明文的字节数组转换成密文的字节数组 。 byte[] encryptedBytes encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length); // 把密文字节数组转换成Base64字符串 return Convert.ToBase64String(encryptedBytes); } } /// summary /// 加密 /// /summary /// param namecipherText密文/param /// param namekey密钥8字节/param /// returns明文/returns public static string Decrypt(string cipherText, string key) { using (DESCryptoServiceProvider des new DESCryptoServiceProvider()) { des.Key Encoding.UTF8.GetBytes(key); des.IV Encoding.UTF8.GetBytes(iv); ICryptoTransform decryptor des.CreateDecryptor(des.Key, des.IV); byte[] cipherBytes Convert.FromBase64String(cipherText); byte[] decryptedBytes decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length); return Encoding.UTF8.GetString(decryptedBytes); } } } }using System.Security.Cryptography; using System.Text; namespace Utility.Encrypt { public static class MD5Helper { /// summary /// MD5加密 /// /summary /// param nameplainText明文/param /// returns密码/returns public static string Encrypt(string plainText) { using (MD5 md5 MD5.Create()) { byte[] inputBytes Encoding.UTF8.GetBytes(plainText); byte[] hashBytes md5.ComputeHash(inputBytes); StringBuilder sb new StringBuilder(); foreach (byte b in hashBytes) { sb.Append(b.ToString(x2)); // 转换为16进制字符串 } return sb.ToString(); } } } }using System; using System.Security.Cryptography; using System.Text; namespace Utility.Encrypt { public static class RSAHelper { /// summary /// 加密 /// /summary /// param nameplainText明文/param /// param namepublicKey公钥/param /// returns密文/returns public static string Encrypt(string plainText, string publicKey) { // 把明文转换成字节数组 byte[] data Encoding.UTF8.GetBytes(plainText); // 创建RSA对象加密服务提供者 using (RSA rsa RSA.Create()) { // 从XML中导入密钥 rsa.FromXmlString(publicKey); // 加密产生密文字节数组 byte[] encryptedBytes rsa.Encrypt(data, RSAEncryptionPadding.Pkcs1); // 把密文字节数组转换成Base64字符串 return Convert.ToBase64String(encryptedBytes); } } /// summary /// 密文解密 /// /summary /// param namecipherText密文/param /// param nameprivateKey私钥/param /// returns明文/returns public static string Decrypt(string cipherText, string privateKey) { // 把密文转换字节数组。 byte[] data Convert.FromBase64String(cipherText); using (RSA rsa RSA.Create()) { rsa.FromXmlString(privateKey); // 解密产生明文字节数组 byte[] decryptedBytes rsa.Decrypt(data, RSAEncryptionPadding.Pkcs1); return Encoding.UTF8.GetString(decryptedBytes); } } } }7。INI文件读写加密算法根据当前密码学领域的通用分类标准加密算法主要分为三大类对称加密算法、非对称加密算法和哈希算法散列函数。这三类算法在原理、密钥使用方式和应用场景上有着本质区别共同构成了现代信息安全的基础。C#中常用的加密算法DES,AES,RSA,MD5这几种。对称加密算法对称加密算法也称为私钥加密算法其核心特征是加密和解密使用同一把密钥或可相互推导的等价密钥。这类算法的优点是加解密速度快、效率高适合对大量数据进行加密处理。主要特点算法公开计算量小加密效率高。其安全性完全依赖于密钥的保密性密钥需要在通信双方之间安全共享这是其主要挑战。常见算法DES(Data Encryption Standard)早期的数据加密标准使用56位密钥因密钥过短已被认为不安全逐渐被淘汰。3DES(Triple DES)DES的增强版对数据块进行三次加密安全性提高但处理速度较慢。AES(Advanced Encryption Standard)目前最流行、最安全的对称加密标准用于替代DES。它支持128、192和256位等多种密钥长度在软硬件上都能快速实现。百科其他算法还包括IDEA、RC系列以及中国的SM4国家标准算法等。非对称加密算法非对称加密算法也称为公钥加密算法它使用一对数学上关联的密钥公钥和私钥。公钥可以公开用于加密或验证签名私钥必须保密用于解密或生成签名。非对称加密解决了对称加密中密钥分发难的问题但加解密速度通常比对称加密慢得多。主要特点无需事先共享密钥解决了密钥分发问题常用于数字签名、身份认证和密钥协商。其安全性基于复杂的数学难题如大整数分解、椭圆曲线离散对数。常见算法RSA最经典和广泛应用的非对称算法安全性基于大整数质因数分解的难度。可用于加密和数字签名。ECC(椭圆曲线密码学)相比RSA在相同安全强度下所需密钥长度更短、处理速度更快、存储空间更小特别适用于移动设备等资源受限环境。DSA(数字签名算法)主要用于数字签名不用于加密。中国的SM2椭圆曲线公钥密码算法也是重要的非对称加密标准。哈希算法Hash哈希算法又称散列函数或摘要算法是一种单向加密算法。它将任意长度的输入数据映射为固定长度的输出哈希值且过程不可逆。哈希算法主要用于验证数据的完整性确保信息在传输过程中未被篡改。主要特点单向性不可逆、抗碰撞性难以找到两个不同输入产生相同输出、雪崩效应输入微小改变导致输出巨大差异。它不需要密钥但存在带密钥的变种如HMAC。主要用途密码存储、数字签名、数据完整性校验。常见算法MD5产生128位哈希值但已被证实存在碰撞漏洞不再推荐用于安全目的。百科SHA系列如SHA-1、SHA-256等。SHA-1也已发现弱点目前SHA-256等更安全的版本被广泛推荐使用。INI文件Initialization File是一种结构简单、人类可读的纯文本配置格式由节[section]、键值对keyvalue和注释;或#开头组成当前仍广泛用于轻量级、非复杂场景的配置管理。应用场景配置通信参数产线配置程序配置系统配置等https://cloud.tencent.com/developer/article/2416602https://www.jb51.net/program/334601b8z.htmusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Utility; namespace UI { public partial class Form3 : Form { INIFileHelper helper new INIFileHelper(); INIFileHelper helper2 new INIFileHelper(D://a.ini); public Form3() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { /* helper.Set(section1, key1, value1); helper.Set(section2, name, 张三);*/ helper2.Set(section1, key1, value1); helper2.Set(section1, key2, value2); helper2.Set(section2, name, 张三); helper2.Set(section2, age, 20); MessageBox.Show(写入成功); } private void button2_Click(object sender, EventArgs e) { //string result helper.Get(section2, name); string result helper2.Get(section2, name); MessageBox.Show(result); } } }using System; using System.Runtime.InteropServices; using System.Text; namespace Utility { public class INIFileHelper { private string path Environment.CurrentDirectory \\ config.ini; public INIFileHelper() { } public INIFileHelper(string path) { this.path path; } // C#中如何调用其他语言编写动态链接库 // kernel32就是windows系统自带的一个动态链接库它提供了一系列的API用来操作ini文件。但不是C#编写的源。 将来操作系统中有很其他语言C或C)编写的动态链接库如user32.dll。动态链接库Dynamic Link Library。kernel32.dll在操作系统的C:\Windows\System32目录下。 // DllImport特性专门用来导入动态链接库的API // 把某个动态链接库中的API导入到C#程序中时有些导入细节 // 1。必须是静态的static 且外部的extern不是用C#语言编写的 // 2。导入动态链接库时DllImport(动态链接库的名称)其他的参数都是可选的 [DllImport(kernel32.dll)] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); [DllImport(kernel32)] private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); /// summary /// 写INI文件 /// /summary /// param namesection写入的节点/param /// param namekey键/param /// param nameval值/param public void Set(string section, string key, string val) { WritePrivateProfileString(section, key, val, this.path); } /// summary /// 读取INI文件 /// /summary /// param namesection读取的节点/param /// param namekey键/param /// returns值/returns public string Get(string section, string key) { StringBuilder temp new StringBuilder(255); GetPrivateProfileString(section, key, , temp, 255, this.path); return temp.ToString(); } } }
SQLHelper,N层框架(三层框架升级)与c#加密算法和INI
1。什么是SQLHelperSqlHelper是基于.NET Framework开发的数据库操作组件主要通过封装ADO.NET对象如SqlConnection、SqlCommand简化数据库访问流程。该组件通过静态方法提供统一的数据访问模式支持传入连接字符串和SQL参数快速执行数据库交互。解读SQLHelperhttps://blog.csdn.net/weixin_66547608/article/details/150936831原版下载https://www.cnblogs.com/dnawo/archive/2012/08/14/2638401.html中文注释版下载https://www.cnblogs.com/gb2013/archive/2009/12/20/1628013.html2。N层框架N层框架核心层Model层模型层实体层主要负责对数据库中的对象表视图存储过程等做映射把数据库中的对象转化成C#语言中的类对象将来在C#项目中使用类对象就相当于使用了数据库中的对象。 映射ORM 对象关系映射 Object Relation MappingIDAL接口层负责抽象DAL层中的共性。将来不同的数据库都可以实现这个共性达到一个项目使用多个数据库的目的可以方便的切换数据库。DAL数据访问层主要负责和数据库交互。SQLServerDAL负责和SQLServer数据库交互OracleDAL负责和Oracle数据库交互。DALFactory抽象工厂层主要负责DAL的创建实例化。根据各种数据库的DAL都必须实现某种接口IDAL才可以让抽象工厂层根据配置文件创建不同数据库实现的DAL。有了抽象工厂层可以让BLL不再强依赖DAL达到解耦的目的。BLL业务逻辑层主要负责对数据库交互即DAL层封装以及对UI校验逻辑的封装。UI层将来直接使用BLL层UI不使用DAL。UI层WindowForm项目来实现UI层UI层依赖BLL,Model,DAL以下两层是工具层不是核心层Common层公共层一般把一个“小工具”封装到这一层中供其他层使用。也可以称为“助手层”DBUtility层数据库工具层N层框架依赖关系Model不依赖任何层IDAL依赖ModelSQLServerDAL依赖IDALModelUtilityDALFactory依赖UtilityBLL依赖IDAL,DALFactory,ModelUI依赖BLL,Model,SQLServerDAL3。回顾一下ADO.NET六大对象a.SqlConnectionb.SqlCommand 对象重要的属性CommandTypeCommandTextParametersSqlCommand 重要的方法ExecuteNoQuery()ExecuteReader()ExecuteScalar()c.SqlDataReaderd.SqlDataAdaptere.DataSetf.SqlParameter一、连接式操作核心全程依赖数据库连接1. Connection 数据库连接对象✅ 一句话定位所有数据库操作的基础负责建立应用和数据库的物理连接✅ 核心重点核心配置ConnectionString连接字符串存储数据库地址、账号、库名、连接超时等信息关键操作Open()打开连接、Close()关闭连接必守规则连接是稀缺资源用完必须及时释放推荐用using语法自动释放ADO.NET默认启用连接池复用连接不主动释放会导致资源耗尽2. Command SQL 命令执行对象✅ 一句话定位向数据库发送 SQL 语句、存储过程的载体✅ 核心重点核心配置CommandText要执行的 SQL / 存储过程名、Parameters参数集合用于参数化查询是防范 SQL 注入的核心手段三个执行方法对应完全不同的场景ExecuteNonQuery()执行增删改操作返回受影响的行数ExecuteScalar()执行查询返回结果集第一行第一列的值适合查COUNT、SUM这类单值结果ExecuteReader()执行查询返回数据流对象DataReader3. DataReader 数据读取器✅ 一句话定位高性能、低内存占用的只读数据遍历工具✅ 核心重点特点全程需要保持连接打开只能按顺序向前遍历、只读不能改内存开销极小读取速度极快适用场景只需要快速遍历查询结果、不需要修改数据的场景比如查询大量列表数据注意用完必须立即关闭否则会一直占用连接4. Transaction 事务对象✅ 一句话定位保证多步数据库操作的原子性要么全部成功要么全部回滚✅ 核心重点使用流程Connection.BeginTransaction()开启事务 → 所有待执行的Command都绑定到该事务 → 所有操作成功调用Commit()提交 → 出现异常调用Rollback()回滚所有操作适用场景转账、订单生成这类需要多步操作强一致的场景二、离线式操作核心可断开数据库连接操作内存数据5. DataAdapter 数据适配器✅ 一句话定位连接数据库和离线数据集的「桥梁」✅ 核心重点内置 4 个 Command 对应 4 类操作SelectCommand查询、InsertCommand新增、UpdateCommand修改、DeleteCommand删除两个核心方法Fill()自动管理连接生命周期把数据库数据拉取填充到DataSet/DataTable不需要手动打开 / 关闭连接Update()把离线数据集里的修改批量同步回数据库效率技巧单表操作场景可以搭配CommandBuilder自动生成增删改 SQL不需要手动编写6. DataSet 数据集✅ 一句话定位内存中的「微型数据库」完全离线独立运行✅ 核心重点特点不需要依赖数据库连接内部可以存储多张DataTable数据表支持定义表间关联、主键、约束支持对数据做增删改查、过滤、排序还可以和 XML 互相转换适用场景需要离线修改数据、多表关联操作、跨层传输数据的场景轻量化替代如果只操作单张表可直接用更轻量的DataTable4。SQLHelper助手有两个版本官方方法少代码量少开发者扩展的带中文注释重载方法多。虽然多主要方法就四个重要方法a. ExectuteDataset()返回一个DataSet() FillDataset()没有返回值但可以填充DataSet参数。b. ExecuteNoQuery()返回影响的行数c. ExectuteReader()返回DataReader,循环获取数据d. ExecuteScalar()返回第一行第一列的值5。Sql分页方案https://blog.csdn.net/zls365365/article/details/128739389https://cloud.tencent.com/developer/article/2037986https://blog.csdn.net/weixin_37610397/article/details/80892426推荐两种方案sqlserver2012至今 推荐使用offset/fetch nextsqlserver2005至sqlserver2012 之间推荐使用row_number方案其他方案涉及嵌套查询性能低不推荐。1.分页方案1--分页方案1最推荐方案是目前最好的方案。 select * from College order by CollegeId offset 0 rows fetch next 2 rows only; --offset偏移量 --偏移量公式(page-1)*pageSize declare page int -- 页码第几页 declare pageSize int --每页显示几条数据 set page4 set pageSize2 select * from College order by CollegeId offset (page-1)*pageSize rows fetch next pageSize rows only;2.分页方案2declare page int declare pageSize int declare startIndex int; declare endIndex int; set page1 set pageSize2 /* startindex (page - 1) * pageSize 1 endindex page*pageSize page1, startindex1, endindex2 page2, startindex3, endindex4 page3, startindex5, endindex6 page4, startindex7, endindex8 startIndex pageSize*page-1 endindex pageSize*page */ set startIndex (page-1)*pageSize1 set endIndex page*pageSize ;with MyData (RowNum, CollegeId, CollegeName, Status, CreateUserId, CreateTime, LastUpdateUserId, LastUpdateTime) as ( select row_number() over(order by CollegeId asc) as RowNum,* from College ) select * from MyData where RowNum startIndex and RowNumendIndex3.分页方案2的旧写法declare page int declare pageSize int declare startIndex int; declare endIndex int; set page1 set pageSize2 /* startindex (page - 1) * pageSize 1 endindex page*pageSize page1, startindex1, endindex4 page2, startindex5, endindex8 startIndex pageSize*page-1 endindex pageSize*page */ set startIndex (page - 1) * pageSize 1 set endIndex page*pageSize select * from ( select row_number() over(order by CollegeId asc) as RowNum,* from College ) as tmp where RowNum startIndex and RowNumendIndex6。C# 加密及解密加密算法根据当前密码学领域的通用分类标准加密算法主要分为三大类对称加密算法、非对称加密算法和哈希算法散列函数。这三类算法在原理、密钥使用方式和应用场景上有着本质区别共同构成了现代信息安全的基础。C#中常用的加密算法DES,AES,RSA,MD5这几种。对称加密算法对称加密算法也称为私钥加密算法其核心特征是加密和解密使用同一把密钥或可相互推导的等价密钥。这类算法的优点是加解密速度快、效率高适合对大量数据进行加密处理。主要特点算法公开计算量小加密效率高。其安全性完全依赖于密钥的保密性密钥需要在通信双方之间安全共享这是其主要挑战。常见算法DES(Data Encryption Standard)早期的数据加密标准使用56位密钥因密钥过短已被认为不安全逐渐被淘汰。3DES(Triple DES)DES的增强版对数据块进行三次加密安全性提高但处理速度较慢。AES(Advanced Encryption Standard)目前最流行、最安全的对称加密标准用于替代DES。它支持128、192和256位等多种密钥长度在软硬件上都能快速实现。百科其他算法还包括IDEA、RC系列以及中国的SM4国家标准算法等。非对称加密算法非对称加密算法也称为公钥加密算法它使用一对数学上关联的密钥公钥和私钥。公钥可以公开用于加密或验证签名私钥必须保密用于解密或生成签名。非对称加密解决了对称加密中密钥分发难的问题但加解密速度通常比对称加密慢得多。主要特点无需事先共享密钥解决了密钥分发问题常用于数字签名、身份认证和密钥协商。其安全性基于复杂的数学难题如大整数分解、椭圆曲线离散对数。常见算法RSA最经典和广泛应用的非对称算法安全性基于大整数质因数分解的难度。可用于加密和数字签名。ECC(椭圆曲线密码学)相比RSA在相同安全强度下所需密钥长度更短、处理速度更快、存储空间更小特别适用于移动设备等资源受限环境。DSA(数字签名算法)主要用于数字签名不用于加密。中国的SM2椭圆曲线公钥密码算法也是重要的非对称加密标准。哈希算法Hash哈希算法又称散列函数或摘要算法是一种单向加密算法。它将任意长度的输入数据映射为固定长度的输出哈希值且过程不可逆。哈希算法主要用于验证数据的完整性确保信息在传输过程中未被篡改。主要特点单向性不可逆、抗碰撞性难以找到两个不同输入产生相同输出、雪崩效应输入微小改变导致输出巨大差异。它不需要密钥但存在带密钥的变种如HMAC。主要用途密码存储、数字签名、数据完整性校验。常见算法MD5产生128位哈希值但已被证实存在碰撞漏洞不再推荐用于安全目的。百科SHA系列如SHA-1、SHA-256等。SHA-1也已发现弱点目前SHA-256等更安全的版本被广泛推荐使用。加密算法主要分为三大类对称加密算法、非对称加密算法和哈希算法散列函数。C#中常用的加密算法DES,AES,RSA,MD5这几种。对称加密算法也称为私钥加密算法其核心特征是加密和解密使用同一把密钥。 DES,AES非对称加密算法也称为公钥加密算法它使用一对数学上关联的密钥公钥和私钥。RAS哈希算法又称散列函数或摘要算法是一种单向加密算法。MD5https://blog.csdn.net/weixin_42113456/article/details/151583486https://www.cnblogs.com/suqq/p/13150546.htmlhttps://blog.51cto.com/u_11566683/6045656?using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Utility.Encrypt; namespace UI { public partial class Form2 : Form { string key1 12345678; // 必须是8字节 string key2 12345678901234567890123456789012; // 必须是32字节 RSA rsa RSA.Create(); public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // DES加密 if (radioButton1.Checked) { textBox2.Text DESHelper.Encrypt(textBox1.Text, key1); } // AES加密 if (radioButton2.Checked) { textBox2.Text AESHelper.Encrypt(textBox1.Text, key2); } // RSA加密 if (radioButton3.Checked) { // 产生加密使用的公钥 string publicKey rsa.ToXmlString(false); // false 表示仅导出公钥 textBox2.Text RSAHelper.Encrypt(textBox1.Text, publicKey); } // MD5加密 if (radioButton4.Checked) { textBox2.Text MD5Helper.Encrypt(textBox1.Text); } } private void button2_Click(object sender, EventArgs e) { // DES解密 if (radioButton1.Checked) { textBox1.Text DESHelper.Decrypt(textBox2.Text, key1); } // AES解密 if (radioButton2.Checked) { textBox1.Text AESHelper.Decrypt(textBox2.Text, key2); } // RSA解密 if (radioButton3.Checked) { // 产生解密使用的私钥 string privateKey rsa.ToXmlString(true); // true 表示导出私钥 textBox1.Text RSAHelper.Decrypt(textBox2.Text, privateKey); } // MD5解密 if (radioButton4.Checked) { MessageBox.Show(MD5无法解密只能暴力破解); } } private void button3_Click(object sender, EventArgs e) { string mw MD5Helper.Encrypt(textBox3.Text); if (mw textBox2.Text) { MessageBox.Show(猜对了); } else { MessageBox.Show(猜错了); } } } }using System; using System.Security.Cryptography; using System.Text; namespace Utility.Encrypt { public static class AESHelper { private static string iv 1234567890123456; // 必须是16字节 /// summary /// 加密 /// /summary /// param nameplainText明文/param /// param namekey密钥/param /// returns密文/returns public static string Encrypt(string plainText, string key) { // 创建AES对象(也是加密服务提供者) using (Aes aes Aes.Create()) { // 给加密服务提供者设置一些参数 aes.Key Encoding.UTF8.GetBytes(key); aes.IV Encoding.UTF8.GetBytes(iv); aes.Mode CipherMode.CBC; aes.Padding PaddingMode.PKCS7; // 创建加密者 ICryptoTransform encryptor aes.CreateEncryptor(aes.Key, aes.IV); byte[] inputBytes Encoding.UTF8.GetBytes(plainText); byte[] encryptedBytes encryptor.TransformFinalBlock(inputBytes, 0, inputBytes.Length); return Convert.ToBase64String(encryptedBytes); } } /// summary /// 解密 /// /summary /// param namecipherText密文/param /// param namekey密钥/param /// returns明文/returns public static string Decrypt(string cipherText, string key) { using (Aes aes Aes.Create()) { aes.Key Encoding.UTF8.GetBytes(key); aes.IV Encoding.UTF8.GetBytes(iv); aes.Mode CipherMode.CBC; aes.Padding PaddingMode.PKCS7; ICryptoTransform decryptor aes.CreateDecryptor(aes.Key, aes.IV); byte[] cipherBytes Convert.FromBase64String(cipherText); byte[] decryptedBytes decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length); return Encoding.UTF8.GetString(decryptedBytes); } } } }using System; using System.Security.Cryptography; using System.Text; namespace Utility.Encrypt { /// summary /// DES加密解密 /// /summary public static class DESHelper { private static string iv abcd6666; // 初始化向量8字节必须是8个字节 /// summary /// 加密 /// /summary /// param nameplainText纯文本明文/param /// param namekey密钥8字节/param /// returns密文/returns public static string Encrypt(string plainText, string key) { // DESCryptoServiceProvider类是 DES加密服务的提供者 using (DESCryptoServiceProvider des new DESCryptoServiceProvider()) { // 给加密服务提供密钥和初始化向量 des.Key Encoding.UTF8.GetBytes(key); des.IV Encoding.UTF8.GetBytes(iv); // 加密者 ICryptoTransform encryptor des.CreateEncryptor(des.Key, des.IV); // 先把明文编码转换UTF8编码的字节数组。 byte[] plainBytes Encoding.UTF8.GetBytes(plainText); // TransformFinalBlock()把明文的字节数组转换成密文的字节数组 。 byte[] encryptedBytes encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length); // 把密文字节数组转换成Base64字符串 return Convert.ToBase64String(encryptedBytes); } } /// summary /// 加密 /// /summary /// param namecipherText密文/param /// param namekey密钥8字节/param /// returns明文/returns public static string Decrypt(string cipherText, string key) { using (DESCryptoServiceProvider des new DESCryptoServiceProvider()) { des.Key Encoding.UTF8.GetBytes(key); des.IV Encoding.UTF8.GetBytes(iv); ICryptoTransform decryptor des.CreateDecryptor(des.Key, des.IV); byte[] cipherBytes Convert.FromBase64String(cipherText); byte[] decryptedBytes decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length); return Encoding.UTF8.GetString(decryptedBytes); } } } }using System.Security.Cryptography; using System.Text; namespace Utility.Encrypt { public static class MD5Helper { /// summary /// MD5加密 /// /summary /// param nameplainText明文/param /// returns密码/returns public static string Encrypt(string plainText) { using (MD5 md5 MD5.Create()) { byte[] inputBytes Encoding.UTF8.GetBytes(plainText); byte[] hashBytes md5.ComputeHash(inputBytes); StringBuilder sb new StringBuilder(); foreach (byte b in hashBytes) { sb.Append(b.ToString(x2)); // 转换为16进制字符串 } return sb.ToString(); } } } }using System; using System.Security.Cryptography; using System.Text; namespace Utility.Encrypt { public static class RSAHelper { /// summary /// 加密 /// /summary /// param nameplainText明文/param /// param namepublicKey公钥/param /// returns密文/returns public static string Encrypt(string plainText, string publicKey) { // 把明文转换成字节数组 byte[] data Encoding.UTF8.GetBytes(plainText); // 创建RSA对象加密服务提供者 using (RSA rsa RSA.Create()) { // 从XML中导入密钥 rsa.FromXmlString(publicKey); // 加密产生密文字节数组 byte[] encryptedBytes rsa.Encrypt(data, RSAEncryptionPadding.Pkcs1); // 把密文字节数组转换成Base64字符串 return Convert.ToBase64String(encryptedBytes); } } /// summary /// 密文解密 /// /summary /// param namecipherText密文/param /// param nameprivateKey私钥/param /// returns明文/returns public static string Decrypt(string cipherText, string privateKey) { // 把密文转换字节数组。 byte[] data Convert.FromBase64String(cipherText); using (RSA rsa RSA.Create()) { rsa.FromXmlString(privateKey); // 解密产生明文字节数组 byte[] decryptedBytes rsa.Decrypt(data, RSAEncryptionPadding.Pkcs1); return Encoding.UTF8.GetString(decryptedBytes); } } } }7。INI文件读写加密算法根据当前密码学领域的通用分类标准加密算法主要分为三大类对称加密算法、非对称加密算法和哈希算法散列函数。这三类算法在原理、密钥使用方式和应用场景上有着本质区别共同构成了现代信息安全的基础。C#中常用的加密算法DES,AES,RSA,MD5这几种。对称加密算法对称加密算法也称为私钥加密算法其核心特征是加密和解密使用同一把密钥或可相互推导的等价密钥。这类算法的优点是加解密速度快、效率高适合对大量数据进行加密处理。主要特点算法公开计算量小加密效率高。其安全性完全依赖于密钥的保密性密钥需要在通信双方之间安全共享这是其主要挑战。常见算法DES(Data Encryption Standard)早期的数据加密标准使用56位密钥因密钥过短已被认为不安全逐渐被淘汰。3DES(Triple DES)DES的增强版对数据块进行三次加密安全性提高但处理速度较慢。AES(Advanced Encryption Standard)目前最流行、最安全的对称加密标准用于替代DES。它支持128、192和256位等多种密钥长度在软硬件上都能快速实现。百科其他算法还包括IDEA、RC系列以及中国的SM4国家标准算法等。非对称加密算法非对称加密算法也称为公钥加密算法它使用一对数学上关联的密钥公钥和私钥。公钥可以公开用于加密或验证签名私钥必须保密用于解密或生成签名。非对称加密解决了对称加密中密钥分发难的问题但加解密速度通常比对称加密慢得多。主要特点无需事先共享密钥解决了密钥分发问题常用于数字签名、身份认证和密钥协商。其安全性基于复杂的数学难题如大整数分解、椭圆曲线离散对数。常见算法RSA最经典和广泛应用的非对称算法安全性基于大整数质因数分解的难度。可用于加密和数字签名。ECC(椭圆曲线密码学)相比RSA在相同安全强度下所需密钥长度更短、处理速度更快、存储空间更小特别适用于移动设备等资源受限环境。DSA(数字签名算法)主要用于数字签名不用于加密。中国的SM2椭圆曲线公钥密码算法也是重要的非对称加密标准。哈希算法Hash哈希算法又称散列函数或摘要算法是一种单向加密算法。它将任意长度的输入数据映射为固定长度的输出哈希值且过程不可逆。哈希算法主要用于验证数据的完整性确保信息在传输过程中未被篡改。主要特点单向性不可逆、抗碰撞性难以找到两个不同输入产生相同输出、雪崩效应输入微小改变导致输出巨大差异。它不需要密钥但存在带密钥的变种如HMAC。主要用途密码存储、数字签名、数据完整性校验。常见算法MD5产生128位哈希值但已被证实存在碰撞漏洞不再推荐用于安全目的。百科SHA系列如SHA-1、SHA-256等。SHA-1也已发现弱点目前SHA-256等更安全的版本被广泛推荐使用。INI文件Initialization File是一种结构简单、人类可读的纯文本配置格式由节[section]、键值对keyvalue和注释;或#开头组成当前仍广泛用于轻量级、非复杂场景的配置管理。应用场景配置通信参数产线配置程序配置系统配置等https://cloud.tencent.com/developer/article/2416602https://www.jb51.net/program/334601b8z.htmusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Utility; namespace UI { public partial class Form3 : Form { INIFileHelper helper new INIFileHelper(); INIFileHelper helper2 new INIFileHelper(D://a.ini); public Form3() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { /* helper.Set(section1, key1, value1); helper.Set(section2, name, 张三);*/ helper2.Set(section1, key1, value1); helper2.Set(section1, key2, value2); helper2.Set(section2, name, 张三); helper2.Set(section2, age, 20); MessageBox.Show(写入成功); } private void button2_Click(object sender, EventArgs e) { //string result helper.Get(section2, name); string result helper2.Get(section2, name); MessageBox.Show(result); } } }using System; using System.Runtime.InteropServices; using System.Text; namespace Utility { public class INIFileHelper { private string path Environment.CurrentDirectory \\ config.ini; public INIFileHelper() { } public INIFileHelper(string path) { this.path path; } // C#中如何调用其他语言编写动态链接库 // kernel32就是windows系统自带的一个动态链接库它提供了一系列的API用来操作ini文件。但不是C#编写的源。 将来操作系统中有很其他语言C或C)编写的动态链接库如user32.dll。动态链接库Dynamic Link Library。kernel32.dll在操作系统的C:\Windows\System32目录下。 // DllImport特性专门用来导入动态链接库的API // 把某个动态链接库中的API导入到C#程序中时有些导入细节 // 1。必须是静态的static 且外部的extern不是用C#语言编写的 // 2。导入动态链接库时DllImport(动态链接库的名称)其他的参数都是可选的 [DllImport(kernel32.dll)] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); [DllImport(kernel32)] private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); /// summary /// 写INI文件 /// /summary /// param namesection写入的节点/param /// param namekey键/param /// param nameval值/param public void Set(string section, string key, string val) { WritePrivateProfileString(section, key, val, this.path); } /// summary /// 读取INI文件 /// /summary /// param namesection读取的节点/param /// param namekey键/param /// returns值/returns public string Get(string section, string key) { StringBuilder temp new StringBuilder(255); GetPrivateProfileString(section, key, , temp, 255, this.path); return temp.ToString(); } } }