VB.Net 操作 Access 数据库实战:驱动选型、参数化查询与避坑指南
简介这份资源是面向VB.Net初学者与桌面应用开发者的Access数据库操作示例工程围绕ADO.Net框架下的OleDb连接、命令执行与数据适配展开帮助读者理解如何在Windows程序中完成对Access数据的增删改查。包内共18个文件以vbproj、sln、vb等工程与源码文件为主辅以xml配置、resx资源、ico图标及mdb数据库文件另有exe可执行程序与pdb调试符号压缩包约47KB结构完整可直接在VS中打开运行。资源涵盖连接字符串配置、OleDbCommand与DataReader读取、参数化DML语句、DataAdapter与DataSet填充绑定等典型场景适合对照源码梳理数据库访问流程、排查连接与提供程序选择问题。目前已有228人学习下载可作为VB.Net结合Access开发的入门参考与练手素材。1. 从一次“找不到 .accdb 驱动”说起这份 Access 数据库操作示例到底能干什么如果你在 VB.Net 里连过 Access大概率遇到过这个报错未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0 提供程序。代码明明照着网上抄的连接字符串也没写错程序一跑就翻车。问题往往不在代码而在驱动位数、Office 版本和编译目标三者的错配。这份 Access 数据库操作示例就是围绕 VB.Net 操作 Access 这条链路把连接、增删改查、参数化查询、异常处理这些环节拆开讲清楚的一份可复现素材。它适合两类人一类是还在用 Access 做小型管理系统的从业者比如单机进销存、设备台账、实验数据记录另一类是想搞懂 ADO.Net 操作文件型数据库底层逻辑的新手。Access 本身门槛低、部署简单一个.accdb文件拷走就能用但它的坑也集中——驱动、并发、SQL 方言、字段类型每一个都能让程序在客户现场趴窝。下面按“能跑起来 → 能改对 → 能避坑”的顺序往下走。2. 环境与连接VB.Net 连 Access 的驱动选型和连接字符串2.1 为什么是 ACE OLEDB 而不是 JetAccess 数据库分两个时代.mdb是 Jet 引擎的产物.accdb是 ACE 引擎的产物。很多人手里的示例代码还在用Microsoft.Jet.OLEDB.4.0这个提供程序只认.mdb而且只有 32 位版本。你拿它去连.accdb直接报“不可识别的数据库格式”。所以第一步要认清自己手里的文件后缀。文件格式推荐提供程序位数限制备注.mdbMicrosoft.Jet.OLEDB.4.0仅 32 位老项目遗留新项目不建议.accdbMicrosoft.ACE.OLEDB.12.032/64 位需匹配需装 Access Database Engine.accdbMicrosoft.ACE.OLEDB.16.032/64 位需匹配随较新 Office 安装选型逻辑很简单新项目一律用 ACE.accdb格式。ACE 提供程序不是 Windows 自带的需要单独安装 Access Database Engine 可再发行组件。这里有个血泪经验如果你机器上装了 64 位 Office又去装 32 位的 ACE 引擎安装程序会直接拒绝提示已安装 64 位版本。反过来也一样。所以驱动位数必须和你的 VB.Net 项目编译目标一致。2.2 连接字符串的三种写法和参数含义连接字符串是 Access 操作里最容易写错又最难排查的部分。常见的有三种写法差别在是否带密码、是否指定数据库位置。 写法一标准无密码连接最常用 Dim connStr As String ProviderMicrosoft.ACE.OLEDB.12.0; Data SourceC:\Data\demo.accdb; Persist Security InfoFalse; 写法二带数据库密码Access 的“数据库密码”不是用户级安全 Dim connStrPwd As String ProviderMicrosoft.ACE.OLEDB.12.0; Data SourceC:\Data\demo.accdb; Jet OLEDB:Database Password你的密码; 写法三相对路径 当前程序目录方便部署 Dim dbPath As String IO.Path.Combine(Application.StartupPath, demo.accdb) Dim connStrRel As String ProviderMicrosoft.ACE.OLEDB.12.0; Data Source dbPath ;逻辑说明Provider决定用哪个引擎写错就是“未注册提供程序”Data Source是.accdb文件的绝对或相对路径路径里有空格不用加引号但建议用Path.Combine拼Persist Security InfoFalse表示连接打开后不再保留密码信息属于安全习惯。参数说明Jet OLEDB:Database Password对应的是在 Access 里“文件 → 信息 → 用密码进行加密”设置的那个密码和旧版用户级安全不是一回事别混。提示连接字符串里的分号是分隔符路径结尾不要多写分号否则会被解析成空参数。2.3 打开连接与释放资源的正确姿势VB.Net 里OleDbConnection实现了IDisposable必须用Using包起来否则连接池耗尽或者文件被锁死后面想删都删不掉。Public Function TestConnection() As Boolean Dim connStr As String ProviderMicrosoft.ACE.OLEDB.12.0; Data Source IO.Path.Combine(Application.StartupPath, demo.accdb) ; Try Using conn As New OleDb.OleDbConnection(connStr) conn.Open() 真正建立连接 Return conn.State ConnectionState.Open End Using 离开 Using 自动 Close Dispose Catch ex As Exception MessageBox.Show(连接失败 ex.Message) Return False End Try End Function逻辑说明Using块结束时无论是否异常都会调用Dispose等价于Close加释放。参数说明conn.State返回ConnectionState枚举判断是否等于Open比直接返回True更严谨。常见错误是把OleDbConnection声明成模块级变量长期持有结果 Access 文件一直被占用别的进程写不进去。3. 增删改查落地参数化 SQL 与 OleDb 的字段类型映射3.1 为什么必须用参数化查询而不是拼字符串Access 的 SQL 方言和 SQL Server 有差异但参数化这件事上是一致的拼接字符串会带来两个问题一是文本字段里的单引号直接把 SQL 拆断二是给注入留了口子。热搜里常出现的“access 注入”说的就是这类拼接查询被利用。正确做法是用OleDbParameter占位符用?不是名字。 新增一条记录参数化写法 Public Sub InsertUser(name As String, age As Integer) Dim connStr As String ProviderMicrosoft.ACE.OLEDB.12.0;Data Source IO.Path.Combine(Application.StartupPath, demo.accdb) ; Dim sql As String INSERT INTO Users (UserName, Age) VALUES (?, ?) Using conn As New OleDb.OleDbConnection(connStr) Using cmd As New OleDb.OleDbCommand(sql, conn) 参数顺序必须和 SQL 里的 ? 一一对应 cmd.Parameters.AddWithValue(?, name) cmd.Parameters.AddWithValue(?, age) conn.Open() Dim rows As Integer cmd.ExecuteNonQuery() MessageBox.Show(影响行数 rows) End Using End Using End Sub逻辑说明OleDbCommand的参数是位置参数?的绑定顺序由Parameters.AddWithValue的调用顺序决定名字写什么都无所谓但顺序错了数据就串位。参数说明ExecuteNonQuery返回受影响行数插入、更新、删除都用它AddWithValue会根据传入值的类型推断OleDbType一般够用但遇到DateTime或Decimal建议显式指定类型避免精度丢失。3.2 查询用 ExecuteReader 还是 DataAdapter读数据有两条路ExecuteReader逐行读适合大数据量或只读一次OleDbDataAdapter填充DataTable适合需要绑定到DataGridView反复操作的场景。Access 单文件数据库在数据量不大时两者差别不明显但DataAdapter会一次性把结果拉进内存。 查询并绑定到 DataGridView Public Function QueryUsers() As DataTable Dim dt As New DataTable() Dim connStr As String ProviderMicrosoft.ACE.OLEDB.12.0;Data Source IO.Path.Combine(Application.StartupPath, demo.accdb) ; Dim sql As String SELECT UserID, UserName, Age FROM Users ORDER BY UserID Using conn As New OleDb.OleDbConnection(connStr) Using adapter As New OleDb.OleDbDataAdapter(sql, conn) adapter.Fill(dt) 自动 Open/Close 连接 End Using End Using Return dt End Function逻辑说明DataAdapter.Fill内部会自己打开和关闭连接不需要手动Open。参数说明返回的DataTable可以直接赋给DataGridView.DataSource。如果表里有备注字段MemoDataAdapter默认可能截断需要在SELECT里注意字段顺序或者改用ExecuteReader配合GetString读取。3.3 更新和删除的 WHERE 条件陷阱更新和删除最怕 WHERE 写漏一条UPDATE Users SET Age 18能把整张表改掉。Access 里没有事务回滚的后悔药除非你显式开事务。 带事务的更新出错可回滚 Public Sub UpdateAge(userId As Integer, newAge As Integer) Dim connStr As String ProviderMicrosoft.ACE.OLEDB.12.0;Data Source IO.Path.Combine(Application.StartupPath, demo.accdb) ; Using conn As New OleDb.OleDbConnection(connStr) conn.Open() Using tran As OleDb.OleDbTransaction conn.BeginTransaction() Try Dim sql As String UPDATE Users SET Age ? WHERE UserID ? Using cmd As New OleDb.OleDbCommand(sql, conn, tran) cmd.Parameters.AddWithValue(?, newAge) cmd.Parameters.AddWithValue(?, userId) cmd.ExecuteNonQuery() End Using tran.Commit() Catch ex As Exception tran.Rollback() Throw End Try End Using End Using End Sub逻辑说明BeginTransaction返回的OleDbTransaction要传给OleDbCommand的构造函数否则命令不在事务里。参数说明Commit提交Rollback回滚。注意 Access 的事务粒度是文件级并发写入时容易互相阻塞单用户场景够用多用户要谨慎。4. 避坑与排查Access 操作里最常见的五类翻车现场4.1 现象报“未注册 Microsoft.ACE.OLEDB.12.0” → 原因驱动缺失或位数不匹配 → 解决装对应位数的 Access Database Engine这是最高频的问题。先确认项目编译目标在 VB.Net 项目属性里看“目标 CPU”AnyCPU在 64 位系统上默认跑 64 位如果装的是 32 位 ACE 引擎就会报错。解决办法有两个一是把编译目标改成x86二是装 64 位 ACE 引擎。注意装了 64 位 Office 的机器通常已经带了 64 位 ACE不用重复装。4.2 现象程序能读不能写或写完后别的程序打不开 → 原因连接没释放文件被独占锁定 → 解决全部用 Using避免模块级连接变量Access 是文件型数据库一个进程打开写入时会生成.laccdb锁文件。如果连接没关锁文件不消失其他程序打开就是只读。排查方法看.accdb同目录下有没有.laccdb有就说明还有连接没释放。养成习惯OleDbConnection、OleDbCommand、OleDbDataReader全部Using。4.3 现象参数化查询结果错位姓名跑到年龄字段 → 原因OleDb 是位置参数AddWithValue 顺序和 SQL 里 ? 不一致 → 解决严格按 ? 出现顺序添加参数OleDbParameter不支持命名参数name在 Access 里会被当成字面量。所以 SQL 里写VALUES (?, ?)参数就必须按第一个?对应姓名、第二个对应年龄的顺序加。建议在 SQL 里把?按字段顺序排好加参数时对照注释。4.4 现象日期字段查询查不到或提示“标准表达式中数据类型不匹配” → 原因Access 日期字面量要用 # 包裹参数类型没指定 → 解决用参数传 DateTime不要拼字符串Access SQL 里日期常量写成#2024-01-01#用字符串拼2024-01-01会报类型不匹配。正确做法还是参数化AddWithValue(?, DateTime.Now)让驱动去处理。如果非要拼 SQL记得用#而不是单引号。4.5 现象多用户同时写报“无法更新数据库或对象为只读” → 原因Access 并发写入锁冲突 → 解决缩短事务时间或改用其他数据库Access 的并发能力有限同一时刻只允许一个写入者。多人同时提交就会排队甚至报错。常见做法是把事务范围缩到最小写完立刻提交如果并发量确实大这个场景就不该用 Access考虑换成 SQLite 或轻量服务型数据库。这不是代码能绕过去的是引擎本身的边界。5. 进阶技巧用 DataSet 做离线更新与 Access 数据同步5.1 DataAdapter 的 Update 机制与 CommandBuilder前面查询用的是DataAdapter.Fill其实它还能反向把DataTable的改动写回数据库靠的是Update方法配合InsertCommand、UpdateCommand、DeleteCommand。手写这三条命令很烦OleDbCommandBuilder可以根据SELECT语句自动生成。 离线修改后批量写回 Public Sub SyncUsers(dt As DataTable) Dim connStr As String ProviderMicrosoft.ACE.OLEDB.12.0;Data Source IO.Path.Combine(Application.StartupPath, demo.accdb) ; Using conn As New OleDb.OleDbConnection(connStr) Dim sql As String SELECT UserID, UserName, Age FROM Users Using adapter As New OleDb.OleDbDataAdapter(sql, conn) Using builder As New OleDb.OleDbCommandBuilder(adapter) CommandBuilder 自动生成增删改命令 adapter.Update(dt) 把 dt 里的改动同步回 Access End Using End Using End Using End Sub逻辑说明CommandBuilder要求SELECT里包含主键否则生成的UPDATE/DELETE的 WHERE 条件不完整可能误伤多行。参数说明adapter.Update(dt)会逐行检查RowState新增行执行 INSERT修改行执行 UPDATE删除行执行 DELETE。这个机制适合“读出来改完再整体写回”的场景比如表格批量编辑。5.2 用 DataSet 做多表关联与本地缓存Access 支持多表关联查询DataSet可以装多张DataTable并建立DataRelation在内存里做父子表联动。常见于主从表界面上面是订单下面是明细。 一次填充主表和明细表建立关系 Public Function LoadOrders() As DataSet Dim ds As New DataSet() Dim connStr As String ProviderMicrosoft.ACE.OLEDB.12.0;Data Source IO.Path.Combine(Application.StartupPath, demo.accdb) ; Using conn As New OleDb.OleDbConnection(connStr) Dim sqlMain As String SELECT OrderID, CustomerName FROM Orders Dim sqlDetail As String SELECT DetailID, OrderID, ProductName FROM OrderDetails Using adapter As New OleDb.OleDbDataAdapter() adapter.SelectCommand New OleDb.OleDbCommand(sqlMain, conn) adapter.Fill(ds, Orders) adapter.SelectCommand New OleDb.OleDbCommand(sqlDetail, conn) adapter.Fill(ds, OrderDetails) End Using End Using 建立主外键关系供界面联动 ds.Relations.Add(OrderDetail, ds.Tables(Orders).Columns(OrderID), ds.Tables(OrderDetails).Columns(OrderID)) Return ds End Function逻辑说明DataRelation建立后可以通过GetChildRows拿到某订单的所有明细。参数说明Fill的第二个参数是表名重复调用同一个DataAdapter时注意换SelectCommand。这个模式在 Access 单机系统里很实用省去反复查库。5.3 验证数据是否真的写进去了写完不验证等于没写。最直接的办法是查SELECT COUNT(*)或者用 Access 打开文件肉眼确认。程序里可以封装一个校验函数插入后立刻按主键查一次。 插入后校验按主键查回记录数 Public Function VerifyInsert(userId As Integer) As Boolean Dim connStr As String ProviderMicrosoft.ACE.OLEDB.12.0;Data Source IO.Path.Combine(Application.StartupPath, demo.accdb) ; Using conn As New OleDb.OleDbConnection(connStr) Using cmd As New OleDb.OleDbCommand(SELECT COUNT(*) FROM Users WHERE UserID ?, conn) cmd.Parameters.AddWithValue(?, userId) conn.Open() Return Convert.ToInt32(cmd.ExecuteScalar()) 1 End Using End Using End Function逻辑说明ExecuteScalar返回第一行第一列适合COUNT、SUM这类聚合。参数说明Convert.ToInt32把返回的Object转成整数再比较。我一般会在关键写入后强制走一遍这个校验尤其是客户现场部署时宁可多查一次也别等对方打电话说数据没存上。从那以后我每次连 Access 都先确认三件事文件后缀、驱动位数、连接字符串里的 Provider一个不对就白忙活。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Apache Beam Python Kata 实战:使用 CombineGlobally 与简单函数实现全局求和

Apache Beam Python Kata 实战:使用 CombineGlobally 与简单函数实现全局求和

【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam18/beam 点击查看 免费下载 Apache Beam 的 Combine 系列转换用于把数据集合中的元素或值聚合成一个结…

2026/10/9 15:22:01 阅读更多 →
基于Unet的LITS肝肿瘤分割实战:从数据预处理到模型训练验证

基于Unet的LITS肝肿瘤分割实战:从数据预处理到模型训练验证

简介:这是一份基于Unet的LITS肝肿瘤分割项目资源包,面向医学图像分割方向的开发者与研究者。内容涵盖完整数据集、Python训练/测试代码与已训练10个epochs的结果文件,网络在全局像素准确度达0.988、miou为0.838,若加大训练轮数性能…

2026/10/9 15:22:00 阅读更多 →
高保真训练场:让强化学习策略从仿真顺利迁移到真实机器人

高保真训练场:让强化学习策略从仿真顺利迁移到真实机器人

做机器人和自主无人系统的强化学习,有个绕不开的现实:算法在仿真环境里跑得飞起,放到真实设备上却像换了脑子。我第一次被这问题折磨,是用一个带视觉的机械臂抓取项目,算法在仿真里成功率已经能到九成,真机…

2026/10/9 15:21:58 阅读更多 →

最新新闻

漫画角色跳出分镜,就算剧情战斗成立了吗?实测6个分镜状态节点

漫画角色跳出分镜,就算剧情战斗成立了吗?实测6个分镜状态节点

很多“一句话把图片或故事生成游戏”的演示,都会出现一个很有吸引力的镜头:漫画书打开,角色从分镜中跳出来,随后与怪物交战。这个画面可以证明题材方向和视觉转场已经形成,却不能直接证明它是一段能够重复游玩的剧情战…

2026/10/9 17:09:46 阅读更多 →
我以为 append 是复制,结果改了原数组:Go 切片的底层数组共享与扩容规则

我以为 append 是复制,结果改了原数组:Go 切片的底层数组共享与扩容规则

个人主页&#xff1a;> 我不会起名字322 < &#xff08;欢迎各位大佬莅临&#x1f60a;&#xff09; 其他栏目&#xff1a;> 技术栈学习笔记 < 其他栏目&#xff1a;> 力扣Hot100题目解析 < 其他栏目&#xff1a;> Go项目学习笔记 < 其他栏目&#xff…

2026/10/9 17:09:46 阅读更多 →
pstack+Claude Code:生产环境死锁定位的AI辅助工作流

pstack+Claude Code:生产环境死锁定位的AI辅助工作流

凌晨两点半&#xff0c;工区灯还亮着&#xff0c;订单引擎服务彻底假死。进程没有退出&#xff0c;core dump自然不可能&#xff0c;日志最后一行停在14:21:30&#xff0c;CPU占用也就5%上下来回晃&#xff0c;可所有写接口全都超时。这种状态最折磨人&#xff0c;进程活着却不…

2026/10/9 17:09:46 阅读更多 →
Genjutsu AI:面向真实视频的单目标动态物体替换技术

Genjutsu AI:面向真实视频的单目标动态物体替换技术

1. 项目概述&#xff1a;这不是“换脸”&#xff0c;而是“换物”——Genjutsu AI 的真实定位与价值锚点你有没有试过&#xff0c;把一段朋友在咖啡馆里喝拿铁的视频发到朋友圈&#xff0c;结果发现杯垫上印着竞争对手的logo&#xff1f;或者拍了一条产品测评&#xff0c;镜头扫…

2026/10/9 17:09:46 阅读更多 →
Claude Code Mod 实战:从斜杠命令到 Hook 的终端 AI 定制指南

Claude Code Mod 实战:从斜杠命令到 Hook 的终端 AI 定制指南

1. 为什么一个“默认就能用”的工具还要折腾 Mod&#xff1a;先搞清楚改的是什么如果你打开一个终端工具&#xff0c;第一反应是“它默认能用就行&#xff0c;没必要改”&#xff0c;那这篇可能不太适合你&#xff1b;但如果你跟我一样&#xff0c;总觉得默认配置差点意思&…

2026/10/9 17:09:46 阅读更多 →
Python 光伏功率预测系统实战:从数据对齐到 LightGBM 建模

Python 光伏功率预测系统实战:从数据对齐到 LightGBM 建模

简介&#xff1a;这份资源面向高校学生与机器学习初学者&#xff0c;提供一套基于Python的光伏发电功率预测系统完整实现&#xff0c;可用于毕业设计、课程结业作业及专题研究等场景。包内共20个文件&#xff0c;以csv训练与测试数据集、py程序脚本为主&#xff0c;另含ipynb交…

2026/10/9 17:08:44 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题&#xff0c;隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题&#xff0c;排查到最后发现是ZonedDateTime序列化后时区丢了&#xff0c;用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问&#xff1a;办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好&#xff0c;问题是工作场景经常要在几处环境之间来回切换&#xff0c;每次都先登录跳板机再层层代理&#xff0c;实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及&#xff0c;但真正动手搭过一套能跑起来的 Agent 系统的人都知道&#xff0c;从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地&#xff0c;从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →