博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MS access 数据定时导入MS SQL Server
阅读量:7057 次
发布时间:2019-06-28

本文共 3244 字,大约阅读时间需要 10 分钟。

有一个程序,是记录公司域用户打印记录,它使用的是MS Access database(A服务器 32bit)。想以这些记录做一些Summary报表,报表实现是另外一台服务器Intranet web 服务(B服务器 64bit)。如查在非一台服务器读取远端的Access数据,也许需要数据库文件共享。网管说不能在服务器安装32 bit的Ole 驱动,不也能共享A服务器的Access数据库文件。

Insus.NET需要怎样做?

只有想法是把这些记录每天定时转存一次至公司的数据库(MS SQL Server 2008 R2)(C服务器)。写一个控制台应用程序,放在Access数据库同一目录,然后让A服务器的任务定时执行这控制台应用程序。

在数据库设计一张表,表结构与Access需要转存记录的表结构一样。 只有第一次转存时,数据量大的话,时间需要长久一些,以后每次只转存SQL 数据库内没有的数据。

View Code
CREATE TABLE [dbo].[PrintLog](    [ID] INT PRIMARY KEY NOT NULL,    --other field list)GO

为了解决在读Access的记录时,以及不必循环插入SQL数据库,Insus.NET 把Access的最数据放在DataTable,并实现直接一次传完入数据库。

因此在SQL server创建一个表数据类型:

View Code
CREATE TYPE [dbo].[udt_PrintLog] AS TABLE    (    [ID] INT NOT NULL,    --other field list here    )GO

接下来,是创建一个存储过程:

View Code
CREATE PROCEDURE [dbo].[usp_PrintLog_Import](    @PrintLogCollection [dbo].[udt_PrintLog] READONLY)ASINSERT INTO [dbo].[PrintLog] ([ID],...)    SELECT pc.[ID],... FROM @PrintLogCollection AS pc;GO

看到否,存储过程的参数的数据类型就是刚才定义好的数据类型。

 然后,再写一个存储过程,是返回SQL数据库表的最大记录ID,如果是空的话,它返回是0。这个值是为读取access的最新记录。

 

 下面是控制台应用程序,写一个类别,是处理SQL的存储过程的:

PrintLog
using System;using System.Collections.Generic;using System.Data;using System.Text;namespace Insus.NET{    class PrintLog    {        public DataTable _PrintLogCollection;        public DataTable PrintLogCollection        {            get            {                return _PrintLogCollection;            }            set            {                _PrintLogCollection = value;            }        }                  BusinessBase objBusinessBase = new BusinessBase();        public int GetMaxID()        {           return Convert.ToInt32(objBusinessBase.ExecuteProcedureScalar("usp_PrintLog_GetMaxID"));           }        public void ImportData()        {            Parameter[] parameter = {                                     new Parameter ("@PrintLogCollection",SqlDbType.Structured,-1,_PrintLogCollection),                                                                        };            objBusinessBase.ExecuteProcedure("usp_PrintLog_Import", parameter);                }    }}

PrintLog类别有一个实例化的类别,这个类别,可以从Insus.NET的博客找到:

BusinessBase objBusinessBase = new BusinessBase();

控制台主程序:

View Code
using System;using System.Collections.Generic;using System.Data;using System.Data.OleDb;using System.Text;namespace Insus.NET{    class Program    {        static void Main(string[] args)        {            PrintLog objPrintLog = new PrintLog();            int maxID = objPrintLog.GetMaxID();            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.Environment.CurrentDirectory + "\\printmgt.mdb";            string sql = "SELECT [porder],... FROM [printlog] WHERE [porder] > " + maxID + "";            DataSet objDs = new DataSet();            using (OleDbConnection oleDbConn = new OleDbConnection(strConn))            using (OleDbCommand objCmd = new OleDbCommand(sql, oleDbConn))            using (OleDbDataAdapter objDa = new OleDbDataAdapter(objCmd))            {                objDa.Fill(objDs);            }            objPrintLog.PrintLogCollection = objDs.Tables[0];            objPrintLog.ImportData();        }    }}

System.Environment.CurrentDirectory这个主要是为了获取控制如应用程序所在目录位置,这样不管数据在那一个位置,只要把这个控制台应用程序可执行文件放在同Access的数据库同一目录即可。

  

转载地址:http://qcgol.baihongyu.com/

你可能感兴趣的文章
MDT 2013排错Provider:SQL Network Interfaces,error:26
查看>>
桌面支持--不能显示中文字体,系统已调成中文 而且不能打字
查看>>
古城钟楼微博:葡萄城程序员演练技术的产物
查看>>
最常用的四种数据分析方法
查看>>
Mesos安装部署笔记
查看>>
epoll的作用和原理介绍
查看>>
服务器远程监控管理(一)-硬件篇
查看>>
Android permission 工具类
查看>>
Tomcat使用与配置
查看>>
接口与抽象类的区别(转)
查看>>
转载:分析apk工具aapt的使用,解析其原理
查看>>
如何向视图插入数据
查看>>
注册和策略模式
查看>>
python 列表
查看>>
第七课作业
查看>>
MEAN实践——LAMP的新时代替代方案(下)
查看>>
CentOS7 下安装 Oracle 12c
查看>>
简单介绍AngularJs Filters
查看>>
Dubbo下一站:Apache顶级项目
查看>>
我说分布式事务之最大努力通知型事务
查看>>