尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Access版物业管理系统源码:二次开发与SQL Server迁移实践

发布时间:2026/9/26 18:26:23

资讯中心
01
ARTICLE

Access版物业管理系统源码:二次开发与SQL Server迁移实践

Access版物业管理系统源码:二次开发与SQL Server迁移实践
简介一套面向小区与大厦物业管理场景的C/S架构源码基于VS2010与Access数据库开发适合物业从业者、C#学习者以及对现有系统做二次开发的工程师。功能上覆盖收费管理、住户管理、房间设置、单价设置、通知单打印并支持住户与收费Excel表的导入导出通知单打印由水晶报表实现扩展方便软件采用多层模式开发界面美观便于业务逻辑梳理。压缩包共376个文件内含96个cs源码文件78个resources资源文件67个dll依赖库以及resx、rdlc报表定义、pdb调试符号等整体大小10.35MB目录结构完整可直接打开调试。当前已有608人学习下载既能满足实际物业管理需求也是一套适合学习C/S应用开发与报表集成的完整案例。1. 物业管理系统源码先别急着换掉 Access这套东西能直接做二次开发很多人第一次拿到这份物业管理系统源码看到解压目录里一堆 ResolveAssemblyReference.cache 和 DesignTimeResolveAssemblyReferencesInput.cache第一反应是文件坏了。其实这些都是 Visual Studio 2010 编译时留下的缓存不影响功能也不参与运行删掉或者放着都行。真正要关注的是 WuYe.csproj 主项目、DAL.csproj 数据访问层以及项目附带的 Access 数据库文件。这套源码是典型的 C/S 结构运行环境是 VS2010 Access界面逻辑和数据访问分得比较清楚。功能上覆盖了小区物业管理最核心的几条业务收费管理、住户管理、房间设置、单价设置、通知单打印还支持收费表和住户表的 Excel 导入导出。通知单打印用的是水晶报表意味着你后面想改单据版式不用动业务代码直接改 rpt 模板就行。适合谁一类是拿它做课程设计或毕业设计的学生需要一个能跑通、能讲清楚模块关系的项目另一类是物业公司或做外包开发的人想拿现成源码做商用前的小范围改造。后面我写的所有步骤都基于我实际跑这种 Access 版物业项目的经验边下边改可以省不少事。2. 先把项目跑起来从解压到 VS2010 还原的完整步骤2.1 解压后先分清文件缓存文件不用动重点是两个 csproj资源解压后表面上有十来个文件但是文件列表里大量重复的 ResolveAssemblyReference.cache 会让人心里发毛。我拆过很多这种源码包这类 cache 文件是 Visual Studio 在编译时自动生成的临时结果和项目是否能跑没有关系。最稳妥的做法是先建立一份“有效文件清单”只保留真正参与编译和运行的项。文件或目录作用处理方式WuYe.csprojWinForm 主项目界面和业务逻辑都在这里用它打开解决方案DAL.csproj数据访问层项目负责操作 Access 数据库被主项目引用不能删ResolveAssemblyReference.cache引用解析缓存可直接删除DesignTimeResolveAssemblyReferencesInput.cache设计时缓存可直接删除DesignTimeResolveAssemblyReferencesInput.cache设计时输入缓存可直接删除*.mdb 或 *.accdbAccess 数据库文件所有物业数据都在里面必须保留建议先备份我一般会在解压后首先删掉所有 cache 文件然后对数据库文件做一次复制备份。原因很简单这套源码里包含数据库而 Access 数据库在 IDE 调试过程中可能被程序写入一旦写入异常导致库文件损坏你手里就没干净底子了。先把原始 .mdb 留在压缩包里不动工作目录里放一份可以随意折腾。还有一点要注意如果你拿到的是带中文名或带空格的目录比如“物业管理系统源码(含access数据库)”建议解压后改成纯英文路径例如D:\WuYeProject。VS2010 对中文路径的兼容性不算好尤其是在引用水晶报表和组件资源时偶尔会冒出“未能加载文件或程序集”的奇怪报错。把路径改干净能省掉一堆说不清的玄学问题。2.2 配置 OLEDB 连接串让 Access 数据库路径不再写死这个项目既然是 VS2010 Access 的组合数据访问层基本逃不掉 OLEDB。很多入门者看到项目里有 DAL.csproj会到处找数据库连接串。实际上连接串一般写在主项目的 App.config 或 DAL 项目的 app.config 里。拿到源码后的第一个动作不是急着点运行而是先确认连接串用的 Provider 是 Microsoft.Jet.OLEDB.4.0 还是 Microsoft.ACE.OLEDB.12.0。Jet 4.0 只能读旧版 .mdb读不了 .accdbACE 两个都能读。如果资源附带的是 .accdb就必须用 ACE.OLEDB.12.0。我习惯把连接串改成下面的样子?xml version1.0 encodingutf-8? configuration connectionStrings add nameWuYeConnection connectionStringProviderMicrosoft.ACE.OLEDB.12.0;Data Source|DataDirectory|WuYe.accdb;Persist Security InfoFalse providerNameSystem.Data.OleDb/ /connectionStrings startup supportedRuntime versionv4.0 sku.NETFramework,Versionv4.0/ /startup /configuration这段配置里最关键的是|DataDirectory|。它是一个运行时占位符程序启动后会替换成当前应用目录也可以被AppDomain.SetData重定向。这样做的最大好处是项目在你的电脑上能跑复制给别人时只要数据库跟着 exe 放到同一目录就不需要打开配置文件改路径。很多从老代码里拿来的物业管理系统连接串会直接写成Data SourceD:\某某盘\WuYe.mdb写死了绝对路径。换一台电脑或把目录挪个位置就崩。如果你拿到的是这种写死路径的版本务必要把连接串改成上面这种相对路径模式。DAL 层读取连接串的代码通常是标准写法public static string ConStr ConfigurationManager.ConnectionStrings[WuYeConnection].ConnectionString; public static OleDbConnection GetConnection() { OleDbConnection conn new OleDbConnection(ConStr); return conn; }这里GetConnection()只负责创建连接不负责打开。谁调用谁负责Open()和Dispose()。我后面做收费保存时就依赖这个方法。优点是所有数据访问逻辑统一走一个入口以后把 Access 换成 SQL Server只需要改 Provider 和连接串界面层不用大动。2.3 用 VS2010 打开编译还原顺序与默认账号排查解压后如果直接双击 WuYe.csproj 打开VS2010 会自动把 DAL.csproj 加进解决方案。前提是两个项目文件在同级目录且项目引用关系没有丢。如果只有两个独立 csproj 而没有 .sln 文件可以手动建一个空解决方案再把两个项目加进去。编译顺序必须是先 DAL 后 WuYe因为主项目引用了 DAL 编译出来的程序集。如果本机安装的是新版 Visual Studio打开老项目时会弹出转换向导不是不能用但组件版本容易对不上。最省心的方式还是装 VS2010或者在命令行里用 .NET 4.0 自带的 MSBuild 编译C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe WuYe.sln /t:Rebuild /p:ConfigurationDebug /p:PlatformAny CPU这条命令会重新编译整个解决方案。注意 Framework 目录下的 v4.0.30319 才是 VS2010 项目的默认工具集。编译成功后会提示生成WuYe.exe。如果报的是“要加载的库不存在”基本可以锁定是水晶报表组件没装。第一次运行前你还要面对一个问题登录账号和密码在哪。大多数这种源码会把管理员账号写死在代码里比如SqlHelper.cs或者登录窗体的Login.cs。我一般直接在项目目录里搜索admin、password、LoginUser这几个关键字。如果数据库是 Access也可以直接打开数据库里的用户表常见表名是SysUser或T_User找到后把密码字段更新成你想用的值。别连接串还没跑通就去想改界面那是浪费精力。3. 四个核心模块收费、住户、房间、单价怎么联动3.1 先梳理 Access 表关系别急着改界面这套物业系统的功能点是收费管理、住户管理、房间设置、单价设置。看代码之前先大概梳理一下 Access 数据库里的表比盲目追界面代码更有效率。根据功能反推表结构基本逃不出下面这套关系。表中文含义常见表名关键字段房间表RoomInfoRoomID、Building、Unit、RoomNo、Area、RoomState住户表OwnerInfoOwnerID、RoomID、OwnerName、Phone、InDate收费项目表ChargeItemItemID、ItemName、UnitPrice、PeriodType收费记录表ChargeRecordRecordID、RoomID、ItemID、Money、ChargeMonth、Operator房间表和住户表是一对多关系一个房间可以住过多个住户所以住户表里保存 RoomID 外键。收费记录表和房间、住户、收费项目都关联一条收费记录同时指向“谁住哪个房间交的是什么费”。单价设置表里保存的是物业费、水费、电费等项目的单价收费时根据房间面积和计费周期自动算出金额。我拿到数据库后会先用 Access 打开看两个地方一是是不是所有表都有关联关系二是收费记录表里的字段是否包含OwnerID。如果只存了 RoomID 没存 OwnerID那打印通知单时“某某住户”只能临时从房间表反查这种情况说明源码里的打印逻辑依赖的是房间当前住户数据迁移时要额外注意。理解表关系之后再去看界面代码你会发现每个窗口无非是对这几张表做增删改查。3.2 房间设置与住户管理状态字段比删除更重要物业软件里最忌讳物理删除房间和住户。房间一旦被删掉历史收费记录全部对不上。所以大部分成熟源码会在房间表或住户表里加一个状态字段比如 RoomState0 表示空置1 表示入住2 表示停用住户表里可能有一个 IsDelete 标记。查询列表时只查有效数据界面上的删除按钮实际执行的是改状态。我建议拿到源码后先别动删除逻辑直接看它的绑定查询写得好不好。例如房间列表要同时显示住户信息private void BindRoomList() { string sql SELECT r.RoomID, r.Building, r.RoomNo, r.Area, o.OwnerName, o.Phone FROM RoomInfo r LEFT JOIN OwnerInfo o ON r.RoomID o.RoomID WHERE r.RoomState 1 ORDER BY r.Building, r.RoomNo; using (OleDbConnection conn new OleDbConnection(DAL.DbHelper.ConStr)) { OleDbDataAdapter da new OleDbDataAdapter(sql, conn); DataTable dt new DataTable(); da.Fill(dt); dgvRoom.DataSource dt; } }这里用LEFT JOIN而不是INNER JOIN是因为房间可能暂时没有住户入住率不是 100%。如果用内连接这类空房间根本显示不出来界面看起来就像数据丢了。这个细节也是很多新手改造源码时会翻车的地方。修改这个查询时要注意如果RoomState不是 1 而是 “1” 字符串Access 也能自动转换。但保险起见参数化查询比拼字符串更安全比如把1换成WHERE r.RoomState ?。Access 的 OLEDB 参数用问号占位顺序必须和 SQL 里的字段顺序一致否则会报“参数不足”这是 Access 和 SQL Server 最大的区别之一。3.3 收费管理先取单价再生成记录事务别省收费管理是整个系统的核心。常见业务逻辑是选择房间、选择收费项目物业费、水费等、选择收费月份系统根据单价和房间面积自动生成应收金额保存到收费记录表。这里有一个新手容易写错的点单价应该在界面选中收费项目时就读出来而不是用户手动填一个数字。从楼层上切进去收费保存的 DAL 方法至少要做两步操作。第一步读单价第二步插入收费记录。如果写入过程半路失败单价已经读出来了但记录没插入用户会觉得金额变了。为防止这种不一致我会在保存方法里套一个数据库事务public bool SaveCharge(string roomId, int itemId, decimal unitPrice, decimal money, string month, string operatorName) { string sqlInsert INSERT INTO ChargeRecord (RoomID, ItemID, Money, ChargeMonth, ChargeDate, Operator) VALUES(?, ?, ?, ?, ?, ?); using (OleDbConnection conn new OleDbConnection(DAL.DbHelper.ConStr)) { conn.Open(); OleDbTransaction tran conn.BeginTransaction(); try { OleDbCommand cmd new OleDbCommand(sqlInsert, conn, tran); cmd.Parameters.Add(RoomID, OleDbType.VarWChar).Value roomId; cmd.Parameters.Add(ItemID, OleDbType.Integer).Value itemId; cmd.Parameters.Add(Money, OleDbType.Decimal).Value money; cmd.Parameters.Add(ChargeMonth, OleDbType.VarWChar).Value month; cmd.Parameters.Add(ChargeDate, OleDbType.Date).Value DateTime.Now; cmd.Parameters.Add(Operator, OleDbType.VarWChar).Value operatorName; cmd.ExecuteNonQuery(); tran.Commit(); return true; } catch (Exception ex) { tran.Rollback(); // 记录日志到文本文件方便现场排查 File.AppendAllText(error_log.txt, ex.ToString()); return false; } } }这段代码里值得抠的地方有两个。一是Parameters.Add的第一参数只是占位符名字但 OLEDB 实际执行时按问号位置匹配所以参数添加顺序必须和 SQL 里的问号顺序完全一致。二是Money字段如果使用OleDbType.Decimal要求数据库字段本身是数字类型如果 Access 里把金额存成文本插入时会不停报类型转换错误。收费记录保存后还应该做一件事更新房间的欠费状态。但原始需求里没有这一项所以要看源码里是否在收费窗口额外调用了房间表更新。如果没有二次开发时就要补上。不补的话列表里永远看不到“哪些房间欠费”。3.4 单价设置与通知单打印水晶报表绑定单价设置的界面通常是一个简单 DataGridView绑定了 ChargeItem 表。这里的难点不是增删改查而是每次改完单价后要能立即影响到收费管理界面。很多源码在“单价设置”保存后没有刷新共享 DataTable导致收费窗口拿到的是旧值用户会认为改价没生效。通知单打印是水晶报表的核心使用场景。VS2010 里如果不安装 Crystal Reports for Visual Studio工程里会找不到ReportDocument类型。安装后rpt 文件可以放到项目下的 Report 目录通过代码动态加载。ReportDocument reportDoc new ReportDocument(); reportDoc.Load(Application.StartupPath \\Report\\Notice.rpt); reportDoc.SetDataSource(chargeTable); reportDoc.SetParameterValue(BuildingName, txtBuilding.Text); reportDoc.SetParameterValue(Period, txtPeriod.Text); crystalReportViewer1.ReportSource reportDoc;这里chargeTable是收费记录加住户姓名的查询结果。SetDataSource直接把 DataTable 作为报表数据源好处是不需要维护数据库连接信息报表文件里不保存密码部署时更安全。SetParameterValue用来传楼栋和费用周期这种界面参数报表里放两个参数字段即可。我拆这种源码时会额外检查 rpt 文件是否被设置成了“不复制到输出目录”。如果 rpt 文件没有随程序发布开发机上正常换一台电脑就白屏。后续部署章节会有专门说明这里先记住一个原则永远用相对路径加载报表不要用开发机的绝对路径。4. Excel 导入导出收费表和住户表怎么安全进出 Access4.1 导入收费 Excel 的流程先读后写模板列别改导入收费 Excel 表和导入住户 Excel 表底层逻辑完全一致都是先读 Excel 到 DataTable再写入 Access。很多物业一线人员手里的 Excel 模板样式不固定甚至有人会合并单元格。所以导入代码不能写死列的位置而应该按列名匹配。private DataTable ReadExcelToTable(string excelPath) { string connStr ProviderMicrosoft.ACE.OLEDB.12.0;Data Source excelPath ;Extended PropertiesExcel 12.0;HDRYES;IMEX1; using (OleDbConnection conn new OleDbConnection(connStr)) { OleDbDataAdapter da new OleDbDataAdapter(SELECT * FROM [Sheet1$], conn); DataTable dt new DataTable(); da.Fill(dt); return dt; } }这段连接串里的HDRYES表示把 Excel 首行当作字段名IMEX1表示当列里同时出现文本和数字时以文本方式读取。IMEX 这个参数很关键不加它混合类型的列可能被驱动判定成数字导致类似“房间编号 101、102、A103”这种列里有些单元格变成空值。拿到 Excel 的 DataTable 后不要直接原样插入 Access。先做三件事删除空行、检查必需列是否为空、将日期和金额列做类型转换。常见做法是foreach (DataRow row in dt.Rows) { if (row[房间编号] null || string.IsNullOrWhiteSpace(row[房间编号].ToString())) continue; string sql INSERT INTO ChargeRecord(RoomID, ItemID, Money, ChargeMonth, ChargeDate) VALUES(?, ?, ?, ?, ?); // 这里的参数值全部从 row 读取金额用 decimal.TryParse 转换 }这个循环是最容易被性能拖垮的地方。如果 Excel 里有几百行逐行插入 Access 还没问题如果有上万行建议用OleDbDataAdapter.Update批量提交或者分段事务提交。我不建议把整个 Excel 一次性塞进事务因为一旦第 500 行格式错误前 499 行也跟着回滚用户很难找出是谁的问题。4.2 导出收费 Excel 表两种实现方式都要会源码功能列表里明确写了“导出收费 Excel 表”和“导出住户 Excel 表”。实现方式通常会分两类一类是调用 Office 的 COM 组件另一类是用 OLEDB 直接创建 Excel 文件。我强烈建议你看清源码用的是哪种方式再改因为 COM 方式在没装 Office 的机器上会直接报“未注册 Microsoft.Office.Interop.Excel”。用 COM 导出的核心代码长这样private void ExportToExcel(DataTable dt, string savePath) { Microsoft.Office.Interop.Excel.Application app new Microsoft.Office.Interop.Excel.Application(); Workbook wb app.Workbooks.Add(); Worksheet ws wb.ActiveSheet; for (int c 0; c dt.Columns.Count; c) { ws.Cells[1, c 1] dt.Columns[c].ColumnName; for (int r 0; r dt.Rows.Count; r) { ws.Cells[r 2, c 1] dt.Rows[r][c].ToString(); } } wb.SaveAs(savePath); wb.Close(); app.Quit(); }这套写法优点是简单直接和 Excel 打开后的版式完全一致缺点是必须在装有 Office 的 Windows 机器上运行服务端部署极其痛苦。如果你只是给小区前台电脑用装 Office 不是问题。如果源码里用的是 OLEDB 方式导出连接串里的Extended Properties要写成Excel 12.0;HDRYES然后用CREATE TABLE [Sheet1$] (...)建表再写入。这个方法不依赖 Office但设置单元格样式非常麻烦导出的文件格式也没那么美观。我的经验是能不动源码就用原方式需要部署到没 Office 的环境再把导出逻辑整体换成第三方库或逗号分隔的 CSV。CSV 看起来落后但至少不会因为缺少 Office 组件而崩。4.3 导入导出的边界类型、空行与文件格式Excel 导入导出最容易出问题的部分不在代码逻辑而在数据本身。首先是 Excel 版本.xls和.xlsx对应不同的驱动版本。如果代码里写的是Excel 8.0导入.xlsx会报“外部表不是预期的格式”。相反Excel 12.0读.xls一般没问题但最佳实践仍然是先判断扩展名再切换连接串。其次是金额列。Excel 单元格显示两位小数但底层可能存了很多位比如“10.10000000000001”。从 Excel 读到 DataTable 时建议统一用decimal.TryParse转成 decimal 再进 Access避免把浮点误差写进收费记录。日期列也有坑尤其是手工填写的“2024.03.05”这种格式OLEDB 驱动可能读成文本导入后日期变成空。所以导入模板里我会让用户只使用标准yyyy-MM-dd格式并在导入前做一次格式检查。空行问题来自 Excel 侧的“看起来是空行实则带格式”。用SELECT * FROM [Sheet1$]会把没有内容的格式行读成全空行插入 Access 时又会因为主键为空而失败。处理方式就是我在前面代码里做的那一步判断关键列是否为空为空直接跳过。这个习惯能省掉 80% 的导入报错。5. 避坑还原和运行这套 Access 版物业源码时最常见的五个坑5.1 启动报错未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0现象程序一打开就弹异常提示未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0。原因这台电脑没有安装 Access 数据库引擎。VS2010 自带的 Jet OLEDB 4.0 只支持 .mdb不支持 .accdb而连接串里写的是 ACE.OLEDB.12.0就必须要额外装引擎。解决去微软官网下载 AccessDatabaseEngine.exe安装后重启程序。如果连接的是 .accdb还要看系统有没有装对应的 64 位或 32 位版本。注意这里有个常见误区32 位程序在 64 位系统上运行时需要的还是 32 位 Access 引擎只装 64 位引擎照样报错。所以我一般直接安装 32 位版本并把项目的“目标平台”设置成 x86。5.2 64 位系统连接 Access 数据库不稳定现象开发环境是 64 位 Windows项目编译和运行都没问题但把程序发布到另一台 64 位电脑后数据库连接时好时坏甚至 32 位和 64 位驱动冲突。原因Access 数据引擎的位数必须和应用程序进程位数匹配。VS2010 默认生成的是 32 位程序集中的 Any CPU在 64 位系统上运行时会进入 64 位进程这时候如果只有 32 位 ACE 驱动就找不到反之也一样。解决打开项目属性把“生成”选项卡里的“目标平台”改成 x86。如果还想用 Any CPU在 .NET 4.0 下可以勾选“首选 32 位”但 VS2010 没有这个选项所以最省心的是直接 x86 编译。部署时目标机器上安装与程序位数一致的 Access 数据库引擎驱动包。这是我拆这种源码时每次都强调的配置比连接串本身还重要。5.3 程序换个目录就找不到数据库文件现象项目在本机运行正常把整个文件夹复制到 U 盘或另一台电脑后一运行就报“无法打开数据库”。它并不是报密码错而是直接找不到文件。原因数据库路径被写成了绝对路径比如D:\WuYeProject\WuYe.accdb。换机器后盘符或目录名变了程序仍然按原路径去找当然找不到。解决全局搜索代码中的.mdb和.accdb字符串把连接串改成|DataDirectory|相对路径。我习惯在Program.cs或主窗体启动事件里手动设置 DataDirectorystring baseDir AppDomain.CurrentDomain.BaseDirectory; AppDomain.CurrentDomain.SetData(DataDirectory, baseDir);这里SetData的作用是把|DataDirectory|指向 exe 所在目录。数据库文件要和 exe 在同一目录或者放到 exe 下的子目录再把连接串写成|DataDirectory|\Data\WuYe.accdb。改完这处以后无论把程序放到哪都不会再为路径问题折腾。5.4 Excel 导入时报“外部表不是预期的格式”现象在导入收费 Excel 表时选择文件后程序抛出“外部表不是预期的格式”的异常。换一个 Excel 文件有时候又正常。原因一段导入代码只支持 .xls 或只支持 .xlsx。OLEDB 连接串里的 Excel 版本和文件扩展名不匹配或者文件本身是 CSV 改名成 xlsx驱动识别不了。解决在读取文件前先用扩展名判断连接串。.xls用string connStr ProviderMicrosoft.ACE.OLEDB.12.0;Data Source filePath ;Extended PropertiesExcel 8.0;HDRYES;IMEX1;.xlsx用string connStr ProviderMicrosoft.ACE.OLEDB.12.0;Data Source filePath ;Extended PropertiesExcel 12.0;HDRYES;IMEX1;如果用户手里是 CSV最好先要求另存为 xlsx再走导入。不要写一个“万能导入”CSV 的解析规则和 Excel 完全不同硬凑到一起只会制造更多边界问题。5.5 水晶报表部署后打印空白现象开发机上点“打印通知单”一切正常部署到前台电脑后报表窗口能打开但是数据区域一片空白或者显示找不到字段。原因缺少水晶报表运行时或者 rpt 文件没有复制到输出目录。开发机能跑是因为 VS2010 自带 Crystal Reports 的完整运行环境部署机只有 .NET Framework缺少额外的 CRRuntime。解决部署时安装与 VS2010 匹配的 Crystal Reports 运行库然后把项目里所有.rpt文件属性设成“复制到输出目录”。如果 rpt 引用了数据库字段还要确认报表数据源的字段名和 Access 表字段一致。Access 穿透到报表时字段名大小写不敏感但空格和下划线很敏感我见过多次因为 Access 字段叫OwnerName报表里写Owner Name导致空白。安装运行时后再测试一次基本能解决。6. 往 SQL Server 迁移把这套物业系统的数据源替换掉并完成验证如果你不满足于 Access 版本我最推荐的二次开发方向就是替换成 SQL Server。这套源码好在有独立 DAL 层收费管理、住户管理界面上并不直接写OleDbConnection所以更换数据库时不用改几十个窗口只需要改数据访问层和连接串。核心改动有三个连接类型从OleDbConnection换成SqlConnection参数占位符从?换成参数名Access 的*通配符要改成%。一段登录查询改造后大概长这样string sql SELECT UserName FROM SysUser WHERE UserNameuser AND Passwordpwd; using (SqlConnection conn new SqlConnection(ConStr)) using (SqlCommand cmd new SqlCommand(sql, conn)) { cmd.Parameters.AddWithValue(user, userName); cmd.Parameters.AddWithValue(pwd, ConvertPassword(pwd)); // 执行查询并判断结果 }数据库表结构可以直接用 Access 导出或者手工在 SQL Server 里照建一遍。迁移后记得把收费记录的日期字段、金额字段检查一遍Access 的Date对应 SQL Server 的DateTimeText对应NVarChar。我每次迁移完都会跑一遍“收费登记、打印通知单、导出 Excel”三个动作确认完整链路没问题再交付。从那以后我每次拿到含 Access 的物业管理系统源码都强制自己先走一遍连接串改相对路径、平台目标改成 x86、数据库备份这三件事再开始看业务代码。这套动作能解决大半的“跑不起来”问题。如果你手上的资源和这篇笔记描述的模块一致按这个顺序去还原应该能在半小时内看到登录窗口。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。