☰
VS2005与Access老项目实战:连接配置、数据访问与避坑指南
2026/10/9 15:16:17 网站建设 项目流程

简介:针对C#初学者和希望快速上手Access数据库开发的读者,配套光盘中收录了VS2005环境下使用C#操作Access数据库的经典案例。内容围绕连接配置、数据增删改查、列表绑定与统计查询等典型场景展开,可帮助学习者从零搭建一个完整可运行的示例,理解桌面数据库应用从代码编写到调试的常见思路。压缩包体积约11.51MB,以zip格式提供,平台暂未列出具体文件数及明细,解压后可看到光盘镜像及案例相关文件,按目录即可定位源码与演示内容。已有255人学习下载,适合用实际项目巩固基础、准备课程设计或日常开发的开发者参考。通过系统研读这些案例,读者能够掌握C#与Access结合开发的常用写法、关键排错方法,实践时少走弯路。

1. 还在跑的老系统里,VS2005 和 Access 依然是「能干活」的组合

如果你现在接手的是某公司十多年前交付的进销存系统,或者某高校的课程设计源码包,大概率会碰到 Visual Studio 2005 搭配 Access 数据库这种组合。VS2005 对应 .NET Framework 2.0 时代,Access 做后台存储,界面用 WinForms 或 ASP.NET WebForm,整套东西在当年是中小型项目的主流选择。今天重新打开这些项目,不是怀旧,而是真的还有业务在跑。某制造企业的生产报工系统至今还在 Windows Server 2003 虚拟机里运行,数据库就是一个几百 MB 的 .mdb 文件,批量导入、报表查询全靠它撑着。

光盘里装的是什么?一般是三样东西:源码工程、数据库文件、部署说明。源码工程解决「代码长什么样」,数据库文件解决「数据从哪来」,部署说明解决「怎么让它跑起来」。但真正拿到的光盘往往对不上号——数据库文件版本不对、连接字符串失效、源码里引用的 DLL 找不齐,这才是需要动手解决的核心问题。

这套技术组合适合谁?两类人最需要:一类是要维护存量系统的开发者,一类是课程设计或毕业设计还在用 Access 做后台的学生。前者要的是稳定性,后者要的是快速出活。这篇文章从光盘里最常见的案例结构讲起,把 ADO.NET 操作 Access 的核心套路、运行环境的配置顺序、以及那几个十次有九次会踩的坑一次说清。

2. 光盘里的经典案例长什么样:从目录结构看学习路径

拿到光盘先别急着双击 .sln 文件,先看目录结构。光盘里放的大多是按「功能模块 + 数据库」组织的内容,读懂目录层级能帮你判断这套案例是教入门还是教综合应用,以及哪些文件可以立刻打开、哪些文件需要额外准备。

2.1 光盘根目录的常见布局与文件用途

我见过的 VS2005 + Access 案例光盘,目录结构大概是这样的:

光盘根目录 ├── 源码 │ ├── 01_图书管理系统 │ ├── 02_学生成绩管理 │ ├── 03_进销存管理 │ ├── 04_工资管理 │ └── 05_酒店客房管理 ├── 数据库 │ ├── Book.mdb │ ├── Student.mdb │ ├── Stock.mdb │ └── Hotel.mdb ├── 课件 │ └── PDF 讲义 └── 部署说明.txt

源码文件夹下有多个独立案例,每个案例是完整的 WinForms 项目。数据库文件夹里是配套的 .mdb 文件,注意这些文件可能放在源码子目录里,也可能单独抽出来放在数据库目录,两种做法都见过。部署说明.txt 一般会写清楚每案例需要 .NET Framework 版本、Access 版本、是否附加数据库。但这条说明文件经常和实际内容对不上,后面踩坑部分会细说。

这类光盘的价值在于一个案例就是一套「前台界面 + 后台数据操作」的最小闭环。图书管理案例演示的是单表增删改查,进销存案例演示的是多表关联和事务处理,酒店客房案例演示的是状态管理和时间计算。从第一个案例复制着敲到最后一个案例能自己写,这条路径基本能把 ADO.NET 的主力用法覆盖掉。

2.2 案例工程的文件组成与入口定位

打开任意一个案例源码文件夹,典型的 VS2005 WinForms 工程文件是这个样子:

图书管理系统 ├── 图书管理系统.sln ├── 图书管理系统.csproj ├── Form1.cs ├── Form1.Designer.cs ├── Form1.resx ├── App.config ├── bin │ └── Debug │ ├── 图书管理系统.exe │ └── 图书管理系统.exe.config └── obj └── Debug └── 图书管理系统.csproj.FileListAbsolute.txt

对新手来说,照着这个结构能快速定位关键代码。Form1.cs 里是事件处理逻辑,比如按钮点击后调什么方法;Form1.Designer.cs 里是界面控件的布局和属性;App.config 里可能存在连接字符串。对熟手来说,看这工程先做两件事:一是搜 App.config 或 Form1.cs 里的 ConnectionString 字段,二是统计 Form 类数量判断界面复杂度。

如果 bin 目录下的 exe 能直接运行,说明此工程自带了运行时所需的全部依赖,多半是数据库文件放到了和 exe 相同的目录。如果 exe 启动后报找不到数据库文件,或者报「Microsoft Jet 提供程序未注册」,说明数据库路径写死了某台开发机的绝对路径,或者运行机器缺 ACE/Jet 引擎。这两种情况都是光盘案例最高频的翻车点,排查思路放在第 4 章统一讲。

3. 把光盘里的老项目跑起来:环境准备与连接字符串

光盘里拿到的 SQL Server 写的案例跑不了?那多半是连接字符串跟当前环境不一致。VS2005 配 Access 和配 SQL Server 不同,前者需要的是本地文件型数据库的驱动,后者需要的是服务型数据库的驱动。搞清楚驱动的选型差异,才能一次把连接配通。

3.1 运行环境最低配置:从 .NET Framework 2.0 到兼容层

VS2005 编译出的程序默认面向 .NET Framework 2.0,这在 Windows 10/11 上是可以直接运行的——系统自带更高版本框架的兼容机制。真正的瓶颈往往在 Access 数据库驱动上。

驱动选择先看数据库文件后缀:

数据库文件后缀需要安装的驱动说明
.mdb(Access 97-2003)Microsoft.Jet.OLEDB.4.032 位系统自带,64 位系统需配置
.mdb(Access 2007 后打开保存过)仍用 Jet.OLEDB.4.0 可读但部分新特性会丢失
.accdb(Access 2007-2016)Microsoft.ACE.OLEDB.12.0 或 16.0需要单独安装 Access Database Engine

光盘案例如果是 05、06 年出版的,基本都是 .mdb 文件,用的连接字符串是经典的 Jet 4.0 写法。如果你把 .mdb 文件交给 64 位系统处理,注意了:Office 2010 之后 Access 安装的是 ACE 驱动,Jet 驱动在 64 位下直接不可用——这就是无数人双击 exe 后看到「未找到提供程序」的根源。

处置办法是安装 Access Database Engine 2010 可再发行版(也就是 ACE 驱动),然后在连接字符串里把 Provider 从 Microsoft.Jet.OLEDB.4.0 改成 Microsoft.ACE.OLEDB.12.0。多数旧程序只需改这一行,不用动其他代码。

3.2 连接 Access 的三种写法与各自适用场景

看光盘源码,连接字符串无非三种写法:写在 App.config 里、写死在代码里、用 Odbc 连接。三种写法各有毛病,先列出来再逐一说明。

<!-- App.config 中的写法 --> <connectionStrings> <add name="AccessDb" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Book.mdb;Persist Security Info=True" providerName="System.Data.OleDb" /> </connectionStrings>
// 写死在代码中的连接字符串 string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Database\\Book.mdb;";
// 用 Odbc 方式连接(不推荐) string connStr = "Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\Database\\Book.mdb;";

第一种写法最接近实战,DataDirectory 是个替换标记,程序运行时被解析为 exe 所在的目录。光盘案例里更常见的是直接指向 C:\Database 这种盘符路径,这就是换台电脑就失效的根源。第二种写法常见于书里做演示的片段代码,正式项目这样写是埋雷。第三种写法依赖机器装了对应的 ODBC 驱动,在 64 位系统上还牵扯 32 位 ODBC 管理器和 64 位 ODBC 管理器两套,不建议在 VS2005 老项目里选这条路。

我一般把连接字符串统一挪到 App.config,并且配合相对路径。这样至少能解决 80% 的「换机器跑不起来」问题。实际操作是:先把 .mdb 文件复制到 exe 所在的 bin\Debug 目录,再在 App.config 里用 DataDirectory 指向当前目录,然后代码里通过 ConfigurationManager.ConnectionStrings["AccessDb"].ConnectionString 来拿连接串。老的配置文件用的是 appSettings 节点,新版用 connectionStrings 节点,两者都兼容 VS2005 编译出的程序。

4. 操作 Access 的核心代码套路:从 DataSet 到 OleDbDataReader

数据库链接配通后就是数据操作了。VS2005 时代操作 Access 无非两条路线:DataAdapter 填充 DataSet 走离线数据操作,OleDbDataReader 走在线逐行读取。光盘案例里两种都会出现,但初学者经常搞混两者的使用场景,把 DataReader 当 DataSet 使,结果界面卡死或者报「已有连接打开」的错。

4.1 用 OleDbDataAdapter 把查询结果填进 DataGridView

光盘里图书管理案例最常见的展示方式是把一张表全部塞进 DataGridView。这种需求用 DataAdapter 最省事。

// 用 DataAdapter 一次性拉取全部图书数据 string connStr = ConfigurationManager.ConnectionStrings["AccessDb"].ConnectionString; string sql = "SELECT BookID, BookName, Category, Price FROM Book;"; using (OleDbConnection conn = new OleDbConnection(connStr)) { using (OleDbDataAdapter adapter = new OleDbDataAdapter(sql, conn)) { DataTable dt = new DataTable(); adapter.Fill(dt); dataGridView1.DataSource = dt; } }

逻辑说明:先建连接对象,再建 DataAdapter 传入 SQL 和连接对象,Fill 方法执行查询并填充 DataTable,最后把 DataTable 赋给 DataGridView 的 DataSource。Fill 内部会替你把连接的打开关闭处理妥当,所以外层再用 using 包一遍连接对象,双保险,防止连接泄漏。

参数说明:OleDbDataAdapter 的构造函数的第一个参数是 SQL 文本,第二个参数既可以是连接字符串也可以是连接对象,这里是连接对象,因为便于后续统一释放。注意 using 的嵌套写法保证了连接和适配器双双释放,这在长循环里尤其重要,否则 Access 会累积连接句柄导致后续操作异常。

4.2 带查询条件的参数化写法:别把值拼进 SQL

光盘里的案例代码常看到这样拼接 SQL:

string sql = "SELECT * FROM Book WHERE Category='" + txtCategory.Text + "'";

这种写法在 Access 下有个比 SQL 注入更实际的问题:如果用户输入的内容带单引号,SQL 直接报语法错误。Access 的单引号转义不彻底,一门心思处理转义很容易挂一漏万,所以正确做法是参数化查询。

string connStr = ConfigurationManager.ConnectionStrings["AccessDb"].ConnectionString; string sql = "SELECT BookID, BookName, Price FROM Book WHERE Category = @cat AND Price > @minPrice"; using (OleDbConnection conn = new OleDbConnection(connStr)) { conn.Open(); using (OleDbCommand cmd = new OleDbCommand(sql, conn)) { cmd.Parameters.Add("@cat", OleDbType.VarWChar).Value = txtCategory.Text.Trim(); cmd.Parameters.Add("@minPrice", OleDbType.Currency).Value = 30; using (OleDbDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader["BookName"] + " - " + reader["Price"]); } } } }

逻辑说明:SQL 里的 @cat 和 @minPrice 是参数占位符,Add 方法依次绑定参数名、OleDbType 类型和实际值。执行时由驱动把参数值安全地传给查询,不存在拼接问题。

参数说明:OleDbType 和具体数据库驱动程序有关,@cat 在 Access 里最常用 VarWChar,对应 Access 的文本类型。@minPrice 在 Access 里用 Currency 类型而不是 Double,因为 Access 的货币类型在比较时避免浮点误差,这个细节在算金额报表时会明显看到差距——用 Double 统计价格经常出现 0.1 + 0.2 不等于 0.3 的尴尬。

这一节里参数的命名习惯注意下:OleDb 参数名虽然以 @ 开头,但 Access 后台并不管你叫什么,它们是驱动层面的占位符。有的老代码里用 ? 问号占位,用法是 cmd.Parameters.Add 时不给参数名只给值和类型,顺序必须和 SQL 里的问号一一对应,如果漏了一个或者反了两个,运行时报「参数不足,期待是 2」——这个报错提示很经典,看见它在 Access 里基本就是参数个数不匹配。

4.3 增删改的事务处理:Access 也得分步提交

进销存案例里经常出现多表联动:销售单插入、库存扣减、流水记录,三个操作必须同时成功或同时失败。Access 支持事务,但用法和 SQL Server 稍有差异。

string connStr = ConfigurationManager.ConnectionStrings["AccessDb"].ConnectionString; using (OleDbConnection conn = new OleDbConnection(connStr)) { conn.Open(); OleDbTransaction transaction = conn.BeginTransaction(); try { string sqlInsert = "INSERT INTO SaleDetail(SaleID, BookID, Quantity, Price) VALUES(@saleID, @bookID, @qty, @price)"; using (OleDbCommand cmdInsert = new OleDbCommand(sqlInsert, conn, transaction)) { cmdInsert.Parameters.Add("@saleID", OleDbType.Integer).Value = saleId; cmdInsert.Parameters.Add("@bookID", OleDbType.Integer).Value = bookId; cmdInsert.Parameters.Add("@qty", OleDbType.Integer).Value = qty; cmdInsert.Parameters.Add("@price", OleDbType.Currency).Value = price; cmdInsert.ExecuteNonQuery(); } string sqlUpdate = "UPDATE Book SET StockNumber = StockNumber - @qty WHERE BookID = @bookID"; using (OleDbCommand cmdUpdate = new OleDbCommand(sqlUpdate, conn, transaction)) { cmdUpdate.Parameters.Add("@qty", OleDbType.Integer).Value = qty; cmdUpdate.Parameters.Add("@bookID", OleDbType.Integer).Value = bookId; cmdUpdate.ExecuteNonQuery(); } transaction.Commit(); } catch { transaction.Rollback(); throw; } }

逻辑说明:先显式开启事务,把事务对象传给每一个 OleDbCommand 的构造函数第三个参数,所有操作对象都挂在同一个连接和事务上。成功后 Commit,任一步失败走进 catch 执行 Rollback。

参数说明:事务必须在同一个 OleDbConnection 上开启,如果你在方法中间新建了一个连接来执行 UPDATE,那是另一个会话,不参与事务回滚。这是新手写 Access 事务最容易栽的跟头:连接对象用错了,事务白开。

写完增删改再提醒一个点:Access 对并发支持有限,这个事务适合单用户、小数据量的场景,比如单机版进销存或实验室管理系统。如果你的案例要放到多人同时操作的服务器环境,该换 SQL Server 或 SQLite 就得换,硬撑 Access 只会让后期维护成本失控。这种选型判断,比会写代码重要得多。

5. Access 开发避坑指南:环境、连接、中文路径与并发问题

光盘案例拿到手,按前面第 3 章的步骤做了还跑不起来,大概率是踩了下面这些坑。这部分是血泪经验,我从「现象 → 原因 → 解决」三个角度写,每一条都能对号入座。

5.1 坑一:64 位系统上「Microsoft.Jet.OLEDB.4.0 未注册」

现象:双击 exe 或按 F5 运行项目,弹出错误:未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0 提供程序。程序在 32 位系统上正常,换到 64 位系统就炸。

原因:Jet 4.0 驱动只有 32 位版本,64 位系统下面向 AnyCPU 编译的程序默认以 64 位进程运行,64 位进程里找不到 32 位驱动的注册信息。

解决:二选一。安装 Access Database Engine 2010 可再发行版(32 位版本),然后把连接字符串里的 Provider 改成 Microsoft.ACE.OLEDB.12.0。或者把程序编译目标改成 x86,强制以 32 位进程运行,继续沿用 Jet.OLEDB.4.0。光盘里的老工程默认是 AnyCPU,建议先看是否引用了一些只能在 32 位下运行的第三方组件;没有的话,改 ACE 驱动是更稳妥的路,因为光是改编译目标这一项,有些环境还会引入新的 DLL 版本纠缠。

5.2 坑二:播放不了的声音文件别用 .mdb 直接连

这里说的声音文件指的不是光盘里的 .wav 示例,而是 Access 的附件字段。VS2005 案例里很少用到 Access 的附件功能,但如果你在研究某款带图片或附件存储的案例,用 OleDb 读出来的是字节数组而不是文件路径。这块新手容易绕进死胡同。

现象:数据库里有照片字段,读出来是一串数字,没法直接给 PictureBox 用。

原因:Access 的 OLE 对象字段存的是复合文档二进制流,不是单纯的文件字节。

解决:读取时转成 byte[],再通过 MemoryStream 装载成 Image:

byte[] imgData = (byte[])reader["Photo"]; using (MemoryStream ms = new MemoryStream(imgData)) { pictureBox1.Image = Image.FromStream(ms); }

但这种写法只能处理 Access 里以位图方式存入的照片,如果是 Office 2007 之后插入的图片格式可能带额外头,读出来是黑的。所以建议:老案例里不要走 OLE 字段路线,把图片路径存文本字段,图片文件放磁盘目录,这才是省心的做法。

5.3 坑三:数据库文件在中文路径下打不开或报错

现象:光盘复制出来的工程,放在 D:\经典案例光盘\图书管理系统\bin\Debug\Book.mdb,程序启动后报错「找不到文件」或「不可识别的数据库格式」。

原因:Access 的老驱动对 UNC 路径和部分非英文字符路径支持不给力,加上光盘复制的文件可能是只读属性,程序无法获得写权限。

解决:把整个工程复制到纯英文路径下,比如 D:\MIS\Books,然后右键 mdb 文件去掉只读属性,并且给 Authenticated Users 赋予完全控制权限。这个坑在 Windows 10/11 上尤其多,因为系统自带的用户权限收紧比 XP 时代狠得多。

5.4 坑四:数据库被锁定文件 .ldb 卡住,程序的写操作超时

现象:程序可以对数据库做 SELECT,但一执行 INSERT 或 UPDATE 就卡住不动,十几秒后报错;查看目录出现了 DatabaseName.ldb 文件。

原因:Access 是文件型数据库,写入时对整个数据库文件加锁。有另一个进程(或自己程序里未释放的连接)长时间占着锁,新写入命令只能排队等待。

解决:这属于并发控制问题,分两步。第一步规范代码里的连接释放,所有 OleDbConnection 都要确保 Dispose;第二步检查是否有遗留的进程还开着数据库,比如另一个调试实例或者 Access 本身打开了这个 mdb 文件,关掉它们,ldb 文件会自动消失。如果这种情况在正常上线后频繁出现,说明这套系统不适合 Access,趁早迁移。

5.5 坑五:安装 ACE 驱动后原 Jet 程序依然报错

现象:安装了 Access Database Engine 2010 x86,连接字符串也改了 ACE.OLEDB.12.0,程序还是报「未找到提供程序」。

原因:安装的是 64 位版本的 ACE 引擎,而程序以 32 位运行。ACE 引擎和 Jet 引擎不同,它有 32 位和 64 位两个独立版本,互不通用。装错了位数的驱动,连接串写对也没用。

解决:打开「控制面板 → 程序和功能」,看已安装的 Access Database Engine 条目,确认是「Microsoft Access Database Engine 2010 (English) x64」还是不带 x64 字母的 32 位版本。卸载掉 64 位版本,安装 32 位版本,重新启动程序。这条坑最玄学的地方在于,很多人检查了连接字符串、路径、权限,唯独没想到驱动位数和进程位数要一致。

5.6 坑六:程序里的密码和用户名校验形同虚设

现象:某个登录案例的 Access 数据库设置了密码,程序能正常运行,但把 mdb 文件用 Access 软件直接打开,不需要密码就能看全部表。

原因:Access 的用户级安全机制在 AccDB 里已经弱化,mdb 的旧密码保护对于 Jet 驱动的某种连接方式来说是透明的,代码里的连接字符串即使写了密码参数也可以被绕过。

解决:如果业务数据真的需要权限控制,不要依赖 Access 的密码机制。把敏感数据挪到 SQL Server,或者对字段级数据进行加密存储。光盘案例里但凡涉及登录功能的,基本只是演示逻辑,实际安全性不要指望它。这个坑是安全设计和数据库选型层面的问题,不懂的人把 Access 当 SQL Server 用,早晚翻车。

6. 进阶:把光盘案例改造成能交付的状态

前面的操作能让你把光盘里的示例完完整整跑起来,但离「拿去交差」还有距离。光盘案例毕竟是教学用途,工程组织、错误处理、数据可靠性都有明显的教学简化痕迹。下面几个改造方向,是我实际整理这些老项目时认为性价比最高的做法。

6.1 统一入口:全局异常处理与连接字符串管理

VS2005 生成的 WinForms 项目默认没有全局异常处理,未捕获的异常会弹出难看的错误对话框,用户看了报错也不知道怎么反馈。加一个全局处理入口,把异常写进日志文件,这是第一个要改造的地方。

以图书管理案例为例,在 Program.cs 的 Main 方法里挂上 Application.ThreadException 事件:

[STAThread] static void Main() { Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) { string logPath = Path.Combine(Application.StartupPath, "error.log"); File.AppendAllText(logPath, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " " + e.Exception.ToString() + Environment.NewLine); MessageBox.Show("程序运行时发生错误,详细信息已记录到错误日志。"); }

顺便把连接字符串统一到 App.config:

<connectionStrings> <add name="AccessDb" connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\Book.mdb;Persist Security Info=True" /> </connectionStrings>

然后所有窗体里通过 ConfigurationManager 读取,不再写字符串字面量。这样做的好处是后续换数据库类型时,只改配置文件一处,不用动程序代码。别小看这一步,光盘案例里同一个连接字符串出现在七八个窗体里是常态,真要改的时候会让你改到怀疑人生。

6.2 用三层结构重构单个案例的业务逻辑

光盘里的案例大多是「窗体代码里直接写 SQL」,代码逻辑全在按钮点击事件里。这种写法在单窗体单表时还行,一旦案例复杂到进销存那种 5 张表以上,窗体事件里的 SQL 和业务交错在一起,改需求的时候极为痛苦。这里推荐把数据访问部分抽到一个公共类里,这个改造投入小收益大。

public static class DbHelper { public static string ConnStr { get { return ConfigurationManager.ConnectionStrings["AccessDb"].ConnectionString; } } public static DataTable ExecuteDataTable(string sql, params OleDbParameter[] parameters) { using (OleDbConnection conn = new OleDbConnection(ConnStr)) { using (OleDbDataAdapter adapter = new OleDbDataAdapter(sql, conn)) { if (parameters != null) adapter.SelectCommand.Parameters.AddRange(parameters); DataTable dt = new DataTable(); adapter.Fill(dt); return dt; } } } }

这样窗体里调用就两行:

DataTable dt = DbHelper.ExecuteDataTable("SELECT * FROM Book WHERE Category = @cat", new OleDbParameter("@cat", txtCategory.Text.Trim()));

参数说明:Each helper method 内部都从配置读连接串,用完自动释放,调用方不用管连接的生命周期。这是从「能跑的案例」到「能维护的代码」的关键一步。就算案例交给学生,照着这个模板写,后期功能扩展也容易。

6.3 数据导入导出:用 Access 文件做离线交换

Access 在今天的实战里还有一个独特的价值:离线数据交换。一些老企业数据分布在多个分支机构,网络条件不好,用 Access 做采集端,定期把 .mdb 文件汇总到总部再导入 SQL Server,这种模式至今还在某些行业里用。光盘里若没有专门讲数据迁移的案例,但你可以拿其中的图书表做模拟练习。

// 从 Access 读取数据并写入 SQL Server string accessConn = ConfigurationManager.ConnectionStrings["AccessDb"].ConnectionString; string sqlConn = ConfigurationManager.ConnectionStrings["SqlServerDb"].ConnectionString; string sql = "SELECT BookID, BookName, Price FROM Book WHERE Price > @minPrice"; DataTable dt = new DataTable(); using (OleDbConnection conn = new OleDbConnection(accessConn)) { using (OleDbDataAdapter adapter = new OleDbDataAdapter(sql, conn)) { adapter.SelectCommand.Parameters.Add("@minPrice", OleDbType.Currency).Value = 10; adapter.Fill(dt); } } using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn)) { bulkCopy.DestinationTableName = "Books"; bulkCopy.ColumnMappings.Add("BookID", "BookID"); bulkCopy.ColumnMappings.Add("BookName", "BookName"); bulkCopy.ColumnMappings.Add("Price", "Price"); bulkCopy.WriteToServer(dt); }

这段演示了 Access 读出、批量写入 SQL Server 的路径。SqlBulkCopy 要 .NET Framework 2.0 以上就有,VS2005 环境可用。实际干活时还要额外处理主键冲突、类型转换、日志记录,但核心思路就是把 Access 当数据源,把 SQL Server 当目标库,中间层用 .NET 代码做搬运。

这个方向值得投入吗?如果你手上正好有老系统需要维护,基础工具链就是 VS2005 或 VS2008 兼容环境、ACE/Jet 驱动、以及 ADO.NET 这几板斧。我自己的经验是,花一个下午把光盘里的图书管理案例按上面的方式重构完成,后续再碰其他 Access 项目,基本都不需要再翻书,无非就是建表、写增删改查、处理导入导出。最怕的是把 Access 项目当成 SQL Server 项目来套路,那会在并发、安全、性能上踩够苦头。希望帮到你,遇到跑不通的案例,按第 5 章的排查顺序过一遍,多数问题都能在当时解决掉——这条经验是我修整了一堆旧光盘案例后最想告诉你的。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询