C#操作Oracle增删改查:ODP.NET驱动选型与参数绑定实战指南
简介一份面向C#开发者的Oracle数据库操作入门源码包基于Visual Studio 2010与ODP.NET实现增删改查涵盖连接、建表、插入、查询、更新、删除及DataGridView界面显示等完整流程。资源共28个文件压缩包约34KB其中9个C#源文件含窗体逻辑、数据访问层与主程序、8张运行截图便于对照界面效果另有项目配置文件、资源文件及解决方案文件结构清晰可直接在VS2010中打开调试。已有336人学习下载。通过实际代码演示OracleConnection、OracleCommand、OracleDataReader等核心类的用法并附带登录窗体与主窗体设计适合初学者快速理解C#操作Oracle数据库的常见模式也可作为企业级应用开发的基础参考。1. C#实现对Oracle的增删改查为什么这个“会写SQL就会”的需求能难住老手先说个人观点在 C# 生态里做 Oracle 增删改查难点从来不是那几个 INSERT、UPDATE、SELECT 怎么写而是驱动怎么选、连接串怎么配、参数绑定时 OracleDbType 怎么映射、字段为 NULL 时怎么处理。多数新人照着 MySQL 的习惯写 Oracle第一次连库就会翻车监听服务起不来、中文乱码、日期少了八小时、ORA-01704 直接把程序打崩。这份资源解决的正是这个问题——它把「C# Oracle 数据库增删改查」从环境配置到增删改查落地整条链路拆开核心驱动用当前最常用的托管版 ODP.NETOracle.ManagedDataAccess.Core配置、参数、存储过程调用、事务、异常排查全都有可直接照抄的写法。适合刚接 Oracle 项目的 .NET 桌面端或服务端开发也适合在用 MySQL 但第一次要对接 Oracle 的团队做选型参考。下面从驱动和连接串开始一步步落到能跑的代码。2. 连接串与驱动选型ODP.NET Core 与 Oracle.ManagedDataAccess.Core 的取舍很多老项目还在用 System.Data.OracleClient但微软早在 .NET Framework 4.0 之后就把这个组件标记为过时Oracle 官方后续出的驱动分两个方向一个是依赖 Oracle 客户端本地安装的非托管版 ODP.NET另一个是纯托管代码的 Oracle.ManagedDataAccess.Core。后者不需要在本机装 Oracle Instant Client部署时不用跟着客户端走这是它能在新项目里流行起来的主要原因。如果你做的是 .NET Core 3.1 或 .NET 5 的 C# 程序我一般会直接上 Oracle.ManagedDataAccess.Core。这个包在 NuGet 上搜Oracle.ManagedDataAccess.Core就能拿到安装命令是dotnet add package Oracle.ManagedDataAccess.Core装完在项目文件里能看到PackageReference项然后写代码时引入using Oracle.ManagedDataAccess.Client;注意非托管版 ODP.NET 包名是Oracle.ManagedDataAccess不带 Core需要额外安装 Oracle Instant Client还会和系统里的 oracle 客户端版本打架。新项目优先选 Core 版微软官方镜像里也能正常跑。这个选择直接影响到后面所有连接串写法别混用。2.1 驱动选型托管驱动与非托管驱动的取舍选驱动前先看部署目标。若是 Windows 桌面端、内网工具类程序两种都能用若是部署到 Linux Docker 容器里非托管版还得在镜像里装 Oracle Instant Client踩过一次就知道多麻烦。我踩过这个坑程序在开发机跑得好好的一发到 CentOS 容器里就连不上最后查是缺了libclntsh.so。换托管版后一个 dll 搞定容器镜像小了一截。托管版运行时不用调用外部 native 库Oracle 的 TNS 配置、网络协议解析都走自己的实现。代价是 TNSNAMES.ORA 文件不会自动找——比如你只有在服务器上配好的tnsnames.ora托管版默认不读它得显式把 TNS_ADMIN 指过去或者干脆用 EZCONNECT 写法直连。string connStr Data Source192.168.1.10:1521/ORCL;User Idscott;Passwordtiger;;用主机:端口/服务名这种直连串不依赖 TNSNAMES是最省心的方式。如果你必须走tnsnames.ora里的别名那就把环境变量 TNS_ADMIN 指到所在目录或者连接串里写Data Source别名并在代码启动时设置Environment.SetEnvironmentVariable(TNS_ADMIN, C:\oracle\sqlnet);2.2 连接字符串参数逐个拆解连接串里最容易翻车的不是账号密码而是Data Source格式。Oracle 的Data Source分两种写法一种是上面的host:port/service_name另一种是host:port/sid两者混写经常导致 ORA-12514。常用服务名取法// EZCONNECT 写法推荐 string connStr Data Source192.168.1.10:1521/ORCL;User Idscott;Passwordtiger;; // 用 tnsnames.ora 别名 string connStr Data SourceMYDB;User Idscott;Passwordtiger;;这里ORCL是服务名不是 SID。如果 DBA 给你的是 SID得写(DESCRIPTION(ADDRESS(PROTOCOLTCP)(HOST192.168.1.10)(PORT1521))(CONNECT_DATA(SIDORCL)))这种完整描述否则连不上。我一般先拿 PL/SQL Developer 测通再写连接串避免被网络或监听问题误导。连接池参数也要调默认池开 100 个连接单机小工具无所谓但桌面端多人并发时最好设个上限连接串冗余的池参数写在连接串后面Poolingtrue;Min Pool Size1;Max Pool Size5;Connection Timeout15;Validate Connectiontrue。Validate Connectiontrue表示每次从池里取出连接时先验证是否断开服务器重启后不至于拿空连接执行时报 ORA-03114。注意这个参数会多一次 round trip性能敏感的场景按需开。3. 增删改查的核心实现参数化绑定与 OracleDbType 映射驱动和连接串通了才轮到底层 SQL 怎么写。这里有一条铁律连 Oracle 的 C# 代码里SQL 里出现的查询条件、写入值全部走参数绑定不要拼字符串。一方面防注入另一方面 Oracle 对参数化 SQL 能缓存执行计划——同一个 SQL 文本用不同参数值重传数据库不用反复硬解析这在批量更新场景下性能差距很大。3.1 SELECTDataReader 与 OracleDataAdapter 的选择查询这块有两种写法一是OracleDataReader流式读取适合大查询二是OracleDataAdapter DataTable适合把结果整个捞回内存再绑定给界面控件。桌面端查单据列表用后者省事直接dataGridView.DataSource dt即可。public DataTable GetEmployeesByDept(int deptId) { string sql SELECT emp_id, emp_name, hire_date FROM emp WHERE dept_id :deptId; using (var conn new OracleConnection(_connStr)) using (var cmd new OracleCommand(sql, conn)) { cmd.Parameters.Add(:deptId, OracleDbType.Int64).Value deptId; var dt new DataTable(); conn.Open(); using (var da new OracleDataAdapter(cmd)) { da.Fill(dt); // 内部自动 open/close但需保持 conn.Open() 已做 } return dt; } }参数名必须带冒号:deptIdOracle 的参数绑定用:前缀这和 SQL Server 的param不一样。类型用OracleDbType.Int64对应数据库里的 NUMBER 类型。Oracle 的 NUMBER 是可变精度数值你用 C# 的 decimal 绑定比 int 更安全——如果字段被 DBA 定义成NUMBER(18, 4)Int64 读出来会丢小数位。连接用完必须 Disposeusing是底线。OracleConnection是外部资源不释放会占连接池时间长了报ORA-01000: maximum open cursors exceeded。3.2 INSERT用 RETURNING INTO 取回自增主键Oracle 没有 SQL Server 那种IDENTITY或 MySQL 的AUTO_INCREMENT常见方案是序列Sequence加触发器。我在 C# 里写 INSERT 时会显式从 Seqence 取值再通过RETURNING ... INTO把主键直接带回程序里避免再查一次数据库。public int InsertEmployee(string name, DateTime hireDate) { string sql INSERT INTO emp(emp_id, emp_name, hire_date) VALUES (seq_emp.NEXTVAL, :empName, :hireDate) RETURNING emp_id INTO :empId; using (var conn new OracleConnection(_connStr)) using (var cmd new OracleCommand(sql, conn)) { cmd.Parameters.Add(:empName, OracleDbType.Varchar2).Value name; cmd.Parameters.Add(:hireDate, OracleDbType.Date).Value hireDate; cmd.Parameters.Add(:empId, OracleDbType.Int64).Direction ParameterDirection.Output; conn.Open(); cmd.ExecuteNonQuery(); return Convert.ToInt32(cmd.Parameters[:empId].Value); } }RETURNING INTO :empId这个输出参数是 Oracle 特有的能力相当于把插入后的主键直接传给 C#。如果没有这行你就得再查一次SELECT seq_emp.CURRVAL FROM dual——注意 CURRVAL 只在当前会话内有效并发时容易拿错序列值。ParameterDirection.Output是执行完后读回参数的关键。INSERT 里序列、触发器两件事最好由数据库负责C# 只管传值。如果公司规范不允许应用读序列那让触发器自动填主键C# 侧用 OUTPUT 参数同样能拿回来。3.3 UPDATE 与 DELETE参数化与受影响行数UPDATE 和 DELETE 比较简单关键在于判断受影响行数用来提示用户“这条记录已经被别人改掉了”之类的业务状态。ExecuteNonQuery()返回的就是受影响行数public int UpdateEmployeeName(int empId, string newName) { string sql UPDATE emp SET emp_name :newName WHERE emp_id :empId; using (var conn new OracleConnection(_connStr)) using (var cmd new OracleCommand(sql, conn)) { cmd.Parameters.Add(:newName, OracleDbType.Varchar2).Value newName; cmd.Parameters.Add(:empId, OracleDbType.Int64).Value empId; conn.Open(); return cmd.ExecuteNonQuery(); // 返回更新的行数 } }这里有个容易忽略的细节Oracle 默认事务是自动提交的但 .NET 驱动在连接未显式BeginTransaction时ExecuteNonQuery每执行一句自动提交相当于 Oracle 的 autocommit 模式。如果你的业务要求“多张表要么全成功要么全失败”必须手动开事务这个下一章讲。大数据量删除时DELETE 会锁行并产生大量 redo 日志清理历史表时可以考虑TRUNCATE TABLE但需 DBA 授权且不能回滚。生产环境删数据前一定确认条件多写一个WHERE查询验证行数这是我摔过的跟头换来的习惯。4. Oracle 存储过程调用与事务控制别只写一句“好一条 SQL”就交付连库、增删改查都通了下一个高频需求就是把业务逻辑丢给 Oracle 存储过程。很多银行、制造业 ERP 系统里核心计算直接在存储过程里完成C# 只负责传参取结果。如果不会调存储过程等于只用了 Oracle 一半的能力。4.1 调用存储过程并取 OUT 参数Oracle 存储过程的参数分三种IN、OUT、IN OUT。C# 侧要明确指定 Direction否则默认 InputOUT 参数拿不到值。以下示例调一个分页加总数量统计的存储过程返回总记录数// Oracle 侧存储过程定义示意 // CREATE OR REPLACE PROCEDURE get_emp_page( // p_dept_id IN NUMBER, // p_page_no IN NUMBER, // p_page_size IN NUMBER, // p_total OUT NUMBER, // p_cursor OUT SYS_REFCURSOR) IS ...C# 调用写法public DataTable GetEmpPage(int deptId, int pageNo, int pageSize, out int total) { using (var conn new OracleConnection(_connStr)) using (var cmd new OracleCommand(get_emp_page, conn)) { cmd.CommandType CommandType.StoredProcedure; cmd.Parameters.Add(p_dept_id, OracleDbType.Int64).Value deptId; cmd.Parameters.Add(p_page_no, OracleDbType.Int64).Value pageNo; cmd.Parameters.Add(p_page_size, OracleDbType.Int64).Value pageSize; var pTotal cmd.Parameters.Add(p_total, OracleDbType.Int64); pTotal.Direction ParameterDirection.Output; var pCursor cmd.Parameters.Add(p_cursor, OracleDbType.RefCursor); pCursor.Direction ParameterDirection.Output; conn.Open(); using (var da new OracleDataAdapter(cmd)) { var dt new DataTable(); da.Fill(dt); // 执行并填充 Result sets total Convert.ToInt32(pTotal.Value); return dt; } } }OracleDbType.RefCursor是 Oracle 返回结果集的专用类型C# 侧不要试图直接读Command.ExecuteReader之外的流用OracleDataAdapter装进 DataTable 最省事。OUT参数必须在执行完成后读取Fill内部会执行命令读pTotal.Value时命令已结束。存储过程传参时如果参数名不带冒号驱动一般能自动补上但建议显式加避免某些特殊字符触发的 ORA-00911 错。存储过程名称也不要放在 sql 字符串里加括号那是 SQL Server 的习惯Oracle 会报“无效的 SQL 语句”。4.2 事务与批量提交桌面系统最常见的需求是“主表 子表同时保存”。比如一张订单有订单头和订单明细两张表必须一起入库。跨表更新就必须开事务了否则第二张表写失败时第一张表的脏数据就落库了想后悔都难。public void SaveOrder(OrderHead head, ListOrderDetail details) { using (var conn new OracleConnection(_connStr)) { conn.Open(); using (var tx conn.BeginTransaction()) // 默认隔离级别 ReadCommitted { try { var cmd new OracleCommand(); cmd.Connection conn; cmd.Transaction tx; foreach (var d in details) { cmd.CommandText INSERT INTO order_detail(...) VALUES (:poNo, :sku, :qty); cmd.Parameters.Clear(); cmd.Parameters.Add(:poNo, OracleDbType.Varchar2).Value head.PoNo; cmd.Parameters.Add(:sku, OracleDbType.Varchar2).Value d.Sku; cmd.Parameters.Add(:qty, OracleDbType.Int64).Value d.Qty; cmd.ExecuteNonQuery(); } tx.Commit(); // 全部成功才提交 } catch { tx.Rollback(); // 任何一张表失败回滚全部 throw; } } } }事务里有一个很关键的细节cmd.Transaction tx必须赋值否则ExecuteNonQuery会报“Connection does not have an active transaction”之类异常。批处理时几条 SQL 共用一个 command 对象注意每次执行前Parameters.Clear()否则参数不断叠加几条后就会参数过多或值错位。事务隔离级别我没动保持 Oracle 默认的ReadCommitted即可如果做库存扣减这种强一致性业务再考虑Serializable。另外事务连接不能和连接池里的连接串行混用一个连接同时只允许一个事务上下文用using及时提交/回滚避免连接泄漏。5. 避坑C# 连 Oracle 的五个高发问题与排查路径写了多年 C# Oracle最耗时的往往不是代码逻辑而是环境与类型映射问题。下面五条是群里被问爆的全部按「现象 → 原因 → 解决」整理直接对照排查。5.1 ORA-12541监听服务无法启动或连不上现象程序连库报ORA-12541: TNS:no listener或ORA-12514。同一套代码在同事机器上正常换台机器就连不上。原因监听进程没启动、LISTENER.ORA 里 HOST 配置成了 localhost、防火墙挡了 1521 端口。更多时候是自己手动改过listener.ora的 HOST 为 127.0.0.1服务器网卡 IP 变了却没人更新。解决先在服务器上执行lsnrctl status看监听状态。如果没启动就lsnrctl start。LOCAL 环境把listener.ora里的 HOST 改成服务器实际内网 IP不要写localhost。再检查监听日志目录$ORACLE_HOME/network/log如果 log 文件巨大好几个 G因为磁盘满也会导致监听服务启动失败清空日志后重启监听。提示排这种问题先确认 DNS/防火墙再确认 TNS最后才怀疑驱动。5.2 ORA-12705中文乱码与 NLS_LANG 不一致现象C# 写入 Oracle 的中文变成¿¿或查询出来全是问号新增连接时报ORA-12705: Cannot access NLS data files。原因Oracle 数据库字符集是 ZHS16GBK而客户端会话的 NLS_LANG 设成了AMERICAN_AMERICA.AL32UTF8或开发机上没装 Oracle 客户端托管驱动读不到 NLS 数据乱码就出现了。解决在程序启动代码里设置OracleGlobalization.Language或者通过环境变量统一// 方案一连接串里加 NLS 参数注意不是所有版本都认 string connStr Data Source192.168.1.10:1521/ORCL;User Idscott;Passwordtiger;NLS_LANGSIMPLIFIED CHINESE_CHINA.ZHS16GBK;更稳妥的是代码里调OracleGlobalization.Session new OracleGlobalization { Language SIMPLIFIED CHINESE, Territory CHINA, DateFormat YYYY-MM-DD HH24:MI:SS };这个设置必须在conn.Open()之前完成会话建立后改无效。如果你不确定目标库字符集先执行SELECT userenv(language) FROM dual;拿到结果后把 C# 侧匹配成同一套。生产环境两端字符集不一致远比“中文变问号”危险可能把几万条数据写坏。5.3 日期字段少了 8 小时现象Oracle 里能看到2024-01-01 12:00:00C# 读出来变成2024-01-01 04:00:00或者写进去少八小时。原因Oracle 的DATE类型不带时区是数据库会话所在时区的时间而 C# 侧DateTime默认走本地时区驱动在转换时如果读取了客户端系统时区或 ORA_SDTZ 配置会造成时间偏移。解决连接串或代码里显式指定会话时区最简单的是统一用「字符型」交换时间。读取时用TO_CHAR(hire_date, YYYY-MM-DD HH24:MI:SS)返回值C# 侧转成DateTime.ParseExact避开驱动内部转换string sql SELECT emp_id, TO_CHAR(hire_date, YYYY-MM-DD HH24:MI:SS) AS hire_date FROM emp;写入时反过来用TO_DATE(:hireDate, YYYY-MM-DD HH24:MI:SS)并把参数以字符串传入。这种方式多了转换但完全绕开了时区偏移问题。如果你是二开 EBS、ERP 这类系统这种写法在复杂 SQL 嵌套里也别乱套只对存在时间偏移的字段做处理。5.4 DBNull 三值逻辑导致 NullReferenceException现象dt.Rows[i][emp_name].ToString()在某些行直接抛异常或显示为System.DBNull。原因Oracle 字段为空时OracleDataAdapter 填到 DataTable 里的值是DBNull.Value而不是null。用索引器[]取到后转 string 不会炸但直接赋值给字符串变量会崩。解决统一封装取值函数public static string SafeString(DataRow row, string col) { return row[col] DBNull.Value ? : Convert.ToString(row[col]); }三层逻辑不只是空值Oracle 里NULL不参与比较WHERE emp_name 张三查不出 emp_name 为 NULL 的记录。C# 侧处理过滤条件时要考虑“空值也算不匹配”这块最容易出线上 bug。5.5 ORA-01704CLOB 字段写入翻车现象写入一段几千字、上万字的文本执行cmd.ExecuteNonQuery()报ORA-01704: string literal too long。原因把CLOB字段当Varchar2来绑定或拼接。Varchar2在较老版本上限 4000 字节超大文本要用 CLOB。更隐蔽的是用字符串直拼 SQL文本里的单引号还可能引发注入或语法错误。解决把参数类型显式设为OracleDbType.Clobcmd.Parameters.Add(:content, OracleDbType.Clob).Value longText;CLOB 参数绑定时Oracle 驱动会做流式写入几 MB 文本没问题。如果文本超过几百 MB需要考虑分段Write到OracleLob对象而不是一次绑定到位。生产环境写入超长文本前先确认字段类型是 CLOB别拿Varchar2(4000)硬扛。6. 进阶把增删改查封装成通用 OracleHelper 并安排一次联调验证走到这里增删改查已经能跑通了最后分享一个让我省了小半年的经验用一套通用 Helper 封装连接和参数把“增删改查”都收敛到同一个入口。下面是浓缩版的骨架不包含全部方法但足够覆盖大多数桌面端工具public class OracleHelper { private readonly string _connStr; public OracleHelper(string connStr) { _connStr connStr; } /// summary执行增删改返回受影响行数/summary public int ExecuteNonQuery(string sql, params OracleParameter[] ps) { using var conn new OracleConnection(_connStr); using var cmd new OracleCommand(sql, conn); if (ps ! null) cmd.Parameters.AddRange(ps); conn.Open(); return cmd.ExecuteNonQuery(); } /// summary执行查询返回 DataTable/summary public DataTable ExecuteDataTable(string sql, params OracleParameter[] ps) { using var conn new OracleConnection(_connStr); using var cmd new OracleCommand(sql, conn); if (ps ! null) cmd.Parameters.AddRange(ps); using var da new OracleDataAdapter(cmd); var dt new DataTable(); da.Fill(dt); return dt; } }使用侧就变得非常正交var db new OracleHelper(connStr); int rows db.ExecuteNonQuery( UPDATE emp SET emp_name :n WHERE emp_id :id, new OracleParameter(:n, OracleDbType.Varchar2) { Value 张三 }, new OracleParameter(:id, OracleDbType.Int64) { Value 1001 });封装完之后建议做一次联调验证别只看“能查出来”要验证写入再读回一致性插入一条记录、查询核对字段、更新再查、删除再查。凡是涉及中文、日期、NULL 三类的字段在验证清单里显式标出来逐列检查值是否一致。从那以后我每次接 Oracle 项目都会强制走一遍这套“驱动确认 → 连接串验证 → 参数类型映射 → 中文/日期/NULL 三点检查”的流程少走了很多弯路。这份资源里的连接串、存储过程调用、事务写法、坑位总结基本覆盖了日常增删改查的全部高频场景照着复现一遍比翻官方文档效率高得多。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

PHP数组并集、交集、差集详解:从array_merge到array_diff的实战避坑指南

PHP数组并集、交集、差集详解:从array_merge到array_diff的实战避坑指南

平时处理用户权限、商品ID、标签这类数据时,PHP数组的并集、交集与差集操作几乎是绕不开的三板斧。你可能已经用过array_merge合并数组、array_intersect找共同值、array_diff剔除多余数据,但真到了实际项目里,键名规则、比较方式和顺序问题往…

2026/10/11 22:51:30 阅读更多 →
Linux IPC进程通信全解析:管道、共享内存与多进程同步选型指南

Linux IPC进程通信全解析:管道、共享内存与多进程同步选型指南

1. IPC 为什么是绕不开的话题:先搞清楚需求再选型1.1 进程间通信的本质与场景Linux 下的多进程程序,几乎都躲不开一个问题:进程之间到底怎么把数据递过去。Linux IPC 进程通信的方法翻来覆去就那么几种——管道、消息队列、共享内存、信号量、…

2026/10/11 22:51:20 阅读更多 →
Self-Adjusting Top Tree 原理与工程实践解析

Self-Adjusting Top Tree 原理与工程实践解析

2. Self-Adjusting 的自适应逻辑2.1 为什么需要“自适应”2.2 旋转与均摊的基本思路2.3 一次访问如何重塑整棵树3. 核心操作拆解与实现要点3.1 Expose 操作:一切查询的入口3.2 路径查询与子树更新的实现3.3 伪代码级别的实现框架3.4 一个可直接用的 C 模板示例4. 工…

2026/10/10 18:21:06 阅读更多 →

最新新闻

同城家政服务平台搭建,多商户派单方案详解

同城家政服务平台搭建,多商户派单方案详解

同城家政服务平台搭建:多商户入驻与智能派单方案详解同城家政行业早已从单一门店自营模式,转向多商户平台化联营发展。平台整合全城多家家政公司、个体服务商、持证服务师傅,统一承接用户订单,通过智能调度完成订单分发与履约。相…

2026/10/11 23:39:46 阅读更多 →
PDF加密权限解除实战:用qpdf免费命令行一键解锁

PDF加密权限解除实战:用qpdf免费命令行一键解锁

上周同事甩过来一个PDF,说打印店打不了,让我帮忙看看。我一看,文件本身没坏,是加了权限限制——允许查看,但打印和复制都被锁了。这种问题我一年能遇到几十次:文档在手机上看一点毛病没有,真要用…

2026/10/11 23:39:46 阅读更多 →
大数据缓存实战:Redis与Alluxio定位配置与踩坑

大数据缓存实战:Redis与Alluxio定位配置与踩坑

干大数据这行的人,迟早会被一个词拦住:慢。任务跑得慢、查询出得慢、报表刷得慢,追根问底,大多不是因为计算引擎不给力,而是存储访问拖了后腿。我在几个大数据平台的项目里折腾过缓存方案,常用的两样是Redi…

2026/10/11 23:39:46 阅读更多 →
基于蝴蝶优化算法的IEEE30节点无功优化Matlab实现与参数调优

基于蝴蝶优化算法的IEEE30节点无功优化Matlab实现与参数调优

1. 从"网损"到算法:先搞懂无功优化到底在优化什么说到电力系统优化调度,"有功优化"大家都很熟——机组出多少钱、发多少有功,直接影响运行成本。但大部分人第一次接触"无功优化"时都会有一个疑问:无…

2026/10/11 23:39:46 阅读更多 →
四月修复版H5农场养殖鸡蛋理财鸡源码部署与支付对接避坑指南

四月修复版H5农场养殖鸡蛋理财鸡源码部署与支付对接避坑指南

简介:最新修复版H5农场牧场养殖理财鸡游戏运营源码,定位为可直接运营的网站游戏项目,适合有建站基础、希望搭建休闲理财类H5游戏的个人或团队二次开发。资源包共2271个文件,约88.4MB,主体由HTML页面、JavaScript逻辑、…

2026/10/11 23:39:46 阅读更多 →
改进版Q-learning实战:Double Q、n步回报与经验回放

改进版Q-learning实战:Double Q、n步回报与经验回放

简介:基于Q-learning的改进版强化学习算法项目,聚焦路径规划场景,面向MATLAB用户及强化学习入门者。项目针对经典Q-learning收敛慢的问题,融合学习率衰减、动态ε-greedy探索、经验回放、目标网络与双线性更新等改进策略&#xff…

2026/10/11 23:38:45 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →