存储程序

2024-07-08

存储程序(精选五篇)

存储程序 篇1

模块化生产加工系统 (MPS, Modular Production System) 是模拟实际加工工业操作过程的开放式教学系统, 是工业自动化生产线的微缩模型。利用该系统, 可以模拟一个与实际生产情况十分接近的控制过程, 从而缩短了理论教学与实际应用之间的距离[1]。立体存储站是整个系统的最后单元, 笔者对MPS系统进行了深入的研究, 采用三菱FX2N-48MR PLC作为主控制器, 对立体存储站的PLC控制程序进行了重新设计。

2 系统组成

MPS由上料检测站、搬运站、加工站、安装站、安装搬运站、立体存储站 (立体仓库) 等6个单元组成 (依次为一至六站) , 如图1所示。

立体存储站将安装搬运站传递过来的组合工件, 按照工件信息 (大小及颜色组合 (黑白、黑黑、白黑、白白) ) , 自动运送到相应的仓位, 并将工件推人立体仓库中。主要由:IO接线端口、丝杆驱动模块、工件推出装置、立体仓库、气源处理组件等部件组成。其中步进驱动模块由步进驱动器和步进电机组成。立体仓储单元有两套步进驱动模块, 分别控制X轴和Y轴方向电机。丝杆驱动模块是将步进电机输出的旋转运动转换成直线反复运动, 丝杆驱动模块成90度垂直安装, 形成一个X—Y轴的平面运动系统。在两个丝杆驱动模块的极限位置装有限位开关, 防止过冲[2]。

3 立体存储站的PLC程序设计

立体仓库的模型如图2所示, 为4层×3仓位立体仓库, 共12个仓位。要求将四类工件依次送入1—4层, 每个仓位所装工件为6个, 装满后自动转入下一仓位。

3.1 I/0地址分配

立体存储站的I/0地址分配及其功能如表1所示。

3.2 PLC程序设计

MPS每站各有一套PLC控制系统独立控制, 各单元可通过I/O通信或现场总线互相通讯, 紧密相连形成一条自动生产线, 因此整个系统的PLC程序较为复杂。为了叙述方便, 暂不考虑通信程序, 立体存储站的PLC程序流程如图3所示。立体仓储的定位控制可采用PLSY脉冲输出指令, 其指令格式为:PLSY【Sl】【S2】【D】, 其中【S1】设定脉冲频率;【S2】为设定脉冲总数;【D】设定脉冲输出的Y地址, 对应PLC的Y0或Yl。指定输出脉冲完成后, M8029置1。当根据工件所放仓位, 设置X、Y轴脉冲个数。由于程序较为复杂, 限于篇幅, 仅对几个关键地方的程序设计方法进行说明。

整个程序以状态器S作为步, 利用步进指令来进行梯形图程序设计, 程序设计如图4-6所示。图4为初始化、复位及根据工件类别选择分支程序, 其中4类工件 (1-4号工件) 由X20、X21状态组合得到 (00, 01, 10, 11) 。根据工件存放仓位设置X、Y轴脉冲程序块设计如图5所示, 图中只给出了1号工件存放仓位设置X、Y轴脉冲程序, 2-4号工件存放仓位设置X、Y轴脉冲程序与之类似, 只是D101设定值不同而已。其中数据存储器D100存往放X轴电机脉冲总数, D101存放Y轴电机脉冲总数, 计数器C101记录同类工件的个数, 当同类工件数达到6时, 自动转入同层的下一仓位。图6为X、Y轴步进电机的驱动定位程序及推料杆推出工件程序。

4 结语

本文介绍了立体存储站的设计流程, 在程序设计时采用状态器和步进指令来进行顺控程序设计, 按照这一思路可以完成本单元的PLC程序设计。在程序设计时, 建议先完成单站的程序设计及调试然后再和前一单元进行通信联调。实践表明, 按照上述思路编写立体存储站程序具有可读性强、程序调试方便等优点, 对立体仓储的程序设计具有一定的参考价值。同时在编程还可考虑多种工作方式 (手动/自动、单站/联网) , 使程序设计更贴近于生产实际。

摘要:文中介绍立体存储站的组成, 立体存储站PLC程序的编制及调试方法。实践表明, 该程序具有可读性强、程序调试方便等优点, 对立体存储单元程序设计具有一定的参考价值。

关键词:模块化生产加工系统,立体存储站,PLC,程序设计

参考文献

[1]吴雪, 宋静, 熊光洁等.MPS系统立体仓库单元的动态模拟[J].机电工程技术, 2008 (1) :73-74.

存储程序 篇2

1、IOS中常用的数据存储方式有哪些?

答:1.数据存储有四种方案,NSUserDefault,KeyChain,File,DB.2.其中File有三种方式:plist,Archiver,Stream 3.DB包括core Data和FMDB

2、说一说你对sqlite的认识

SQLite是目前主流的嵌入式关系型数据库,其最主要的特点就是轻量级、跨平台,当前很多嵌入式操作系统都将其作为数据库首选。虽然SQLite是一款轻型数据库,但是其功能也绝不亚于很多大型关系数据库。学习数据库就要学习其相关的定义、操作、查询语言,也就是大家日常说得SQL语句。和其他数据库相比,SQLite中的SQL语法并没有太大的差别,因此这里对于SQL语句的内容不会过多赘述,大家可以参考SQLite中其他SQL相关的内容,这里还是重点讲解iOS中如何使用SQLite构建应用程序。先看一下SQLite数据库的几个特点:

1.基于C语言开发的轻型数据库

2.在iOS中需要使用C语言语法进行数据库操作、访问(无法使用ObjC直接访问,因为libqlite3框架基于C语言编写)

3.SQLite中采用的是动态数据类型,即使创建时定义了一种类型,在实际操作时也可以存储其他类型,但是推荐建库时使用合适的类型(特别是应用需要考虑跨平台的情况时)

4.建立连接后通常不需要关闭连接(尽管可以手动关闭)

在iOS中操作SQLite数据库可以分为以下几步(注意先在项目中导入libsqlite3框架):

1.打开数据库,利用sqlite3_open()打开数据库会指定一个数据库文件保存路径,如果文件存在则直接打开,否则创建并打开。打开数据库会得到一个sqlite3类型的对象,后面需要借助这个对象进行其他操作。

2.执行SQL语句,执行SQL语句又包括有返回值的语句和无返回值语句。3.对于无返回值的语句(如增加、删除、修改等)直接通过sqlite3_exec()函数执行;

4.对于有返回值的语句则首先通过sqlite3_prepare_v2()进行sql语句评估(语法检测),然后通过sqlite3_step()依次取出查询结果的每一行数据,对于每行数据都可以通过对应的sqlite3_column_类型()方法获得对应列的数据,如此反复循环直到遍历完成。当然,最后需要释放句柄。

3、说一说你对FMDB的认识

FMDB是一个处理数据存储的第三方框架,框架是对sqlite的封装,整个框架非常轻量级但又不失灵活性,而且更加面向对象。FMDB有如下几个特性:

1.FMDB既然是对于libsqlite3框架的封装,自然使用起来也是类似的,使用前也要打开一个数据库,这个数据库文件存在则直接打开否则会创建并打开。这里FMDB引入了一个MFDatabase对象来表示数据库,打开数据库和后面的数据库操作全部依

赖此对象。

2.对于数据库的操作跟前面KCDbManager的封装是类似的,在FMDB中FMDatabase类提供了两个方法executeUpdate:和executeQuery:分别用于执行无返回结果的查询和有返回结果的查询。当然这两个方法有很多的重载这里就不详细解释了。唯一需要指出的是,如果调用有格式化参数的sql语句时,格式化符号使用“?”而不是“%@”、等。

3.我们知道直接使用libsqlite3进行数据库操作其实是线程不安全的,如果遇到多个线程同时操作一个表的时候可能会发生意想不到的结果。为了解决这个问题建议在多线程中使用FMDatabaseQueue对象,相比FMDatabase而言,它是线程安全的。

4.将事务放到FMDB中去说并不是因为只有FMDB才支持事务,而是因为FMDB将其封装成了几个方法来调用,不用自己写对应的sql而已。其实在在使用libsqlite3操作数据库时也是原生支持事务的(因为这里的事务是基于数据库的,FMDB还是使用的SQLite数据库),只要在执行sql语句前加上“begin transaction;”执行完之后执行“commit transaction;”或者“rollback transaction;”进行提交或回滚即可。另外在Core Data中大家也可以发现,所有的增、删、改操作之后必须调用上下文的保存方法,其实本身就提供了事务的支持,只要不调用保存方法,之前所有的操作是不会提交的。在FMDB中FMDatabase有beginTransaction、commit、rollback三个方法进行开启事务、提交事务和回滚事务。

4、说一说你对Core Data的认识

Core Data使用起来相对直接使用SQLite3的API而言更加的面向对象,操作过

程通常分为以下几个步骤:

1.创建管理上下文

创建管理上下可以细分为:加载模型文件->指定数据存储路径->创建对应数据类型的存储->创建管理对象上下方并指定存储。

经过这几个步骤之后可以得到管理对象上下文NSManagedObjectContext,以后所有的数据操作都由此对象负责。同时如果是第一次创建上下文,Core Data会自动创建存储文件(例如这里使用SQLite3存储),并且根据模型对象创建对应的表结构。

2.查询数据

对于有条件的查询,在Core Data中是通过谓词来实现的。首先创建一个请求,然后设置请求条件,最后调用上下文执行请求的方法。

3.插入数据

插入数据需要调用实体描述对象NSEntityDescription返回一个实体对象,然后设置对象属性,最后保存当前上下文即可。这里需要注意,增、删、改操作完最后必须调用管理对象上下文的保存方法,否则操作不会执行。

4.删除数据

删除数据可以直接调用管理对象上下文的deleteObject方法,删除完保存上下文即可。注意,删除数据前必须先查询到对应对象。

5.修改数据

修改数据首先也是取出对应的实体对象,然后通过修改对象的属性,最后保存上下文。

5、OC中有哪些数据存储方式,各有什么区别? OC中有四种数据存储方式: 1).NSUserDefaults,用于存储配置信息 2).SQLite,用于存储查询需求较多的数据 3).CoreData,用于规划应用中的对象

4).使用基本对象类型定制的个性化缓存方案.NSUserDefaults:对象中储存了系统中用户的配置信息,开发者可以通过这个实例对象对这些已有的信息进行修改,也可以按照自己的需求创建新的配置项。SQLite擅长处理的数据类型其实与NSUserDefaults差不多,也是基础类型的小数据,只是从组织形式上不同。开发者可以以关系型数据库的方式组织数据,使用SQL DML来管理数据。一般来说应用中的格式化的文本类数据可以存放在数据库中,尤其是类似聊天记录、Timeline等这些具有条件查询和排序需求的数据。CoreData是一个管理方案,它的持久化可以通过SQLite、XML或二进制文件储存。它可以把整个应用中的对象建模并进行自动化的管理。从归档文件还原模型时CoreData并不是一次性把整个模型中的所有数据都载入内存,而是根据运行时状态,把被调用到的对象实例载入内存。框架会自动控制这个过程,从而达到控制内存消耗,避免浪费。无论从设计原理还是使用方法上看,CoreData都比较复杂。因此,如果仅仅是考虑缓存数据这个需求,CoreData绝对不是一个优选方案。CoreData的使用场景在于:整个应用使用CoreData规划,把应用内的数据通过CoreData建模,完全基于CoreData架构应用。使用基本对象类型定制的个性化缓存方案:从需求出发分析缓存数据有哪些要求:按Key查找,快速读取,写入不影响正常操作,不浪费内存,支持归档。这些都是基本需求,那么再进一步或许还需要固定缓存项数量,支持队列缓存,缓存过期等。

数据存储这一块,面试常问, 你常用哪一种数据存储?什么是序列化?sqlite是直接用它还是用封装了它的第三方库?尤其是会问sqlite和core data的区别?

5、IOS平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?

iOS中可以有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data coredata可以使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。coredata提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在app中继续创建新的任务。在使用coredata的时候,你不用安装额外的数据库系统,因为coredata使用内置的sqlite数据库。coredata将你app的模型层放入到一组定义在内存中的数据对象。coredata会追踪这些对象的改变,同时可以根据需要做相应的改变,例如用户执行撤销命令。当coredata在对你app数据的改变进行保存的时候,core data会把这些数据归档,并永久性保存。mac os x中sqlite库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。可以在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程。与coredata框架不同的是,sqlite是使用程序式的,sql的主要的API来直接操作数据表。Core Data不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS)。虽然Core Dta支持SQLite作为一种存储类型, 但它不能使用任意的SQLite数据库。Core Data在使用的过程种自己创建这个数据库。Core Data支持对

一、对多的关系。

6、如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢?

编写SQL语句来操作原来表中的字段 增加表字段

ALTER TABLE 表名 ADD COLUMN 字段名字段类型;• 删除表字段

ALTER TABLE 表名 DROP COLUMN 字段名;

.修改表字段

ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名;

7、SQLite数据存储是怎么用?

添加SQLite动态库:

导入主头文件:#import 利用C语言函数创建打开数据库,编写SQL语句

8、简单描述下客户端的缓存机制?

1>缓存可以分为:内存数据缓存、数据库缓存、文件缓存 2>每次想获取数据的时候 3>先检测内存中有无缓存

4>再检测本地有无缓存(数据库文件)5>最终发送网络请求

6>将服务器返回的网络数据进行缓存(内存、数据库、文件),以便下次读取

9、你实现过多线程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在线程中创建或者传递?你是用什么样的策略来实现的?

1>CoreData是对SQLite数据库的封装

2>CoreData中的NSManagedObjectContext在多线程中不安全

3>如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext 4>每个NSManagedObjectContext对象实例都可以使用同一个NSPersistentStoreCoordinator实例,这是因为NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁

10、core data数据迁移

博客地址: http://blog.csdn.net/jasonblog/article/details/17842535

11、FMDB的使用和对多张表的处理

博客地址: http://blog.csdn.net/wscqqlucy/article/details/8464398

12、说说数据库的左连接和右连接的区别

加密存储设备驱动程序的优化设计 篇3

目前设备驱动模型有两种, 一种是虚拟设备驱动程序 (简称为VxD) ;另一种是WDM设备驱动模型, Windows2000/XP采用了WDM驱动程序模型以替代Windows 9X下的原Vx D设备驱动程序。WDM支持USB协议, 是一个跨平台的驱动程序模型, 在不修改WDM驱动程序源代码的情况下, 经过重新编译后可在非Intel平台上运行, 并为其提供了高效的开发平台。因此WDM已成为开发USB外设驱动程序的主流技术。

在Windows 2000/XP中, 设备驱动程序必须根据Windows WDM驱动程序模型进行设计, WDM为基于Windows NT 4和NT 351中使用的设备驱动程序模型。

1.1 WDM驱动程序模型

WDM的关键目标是通过提供一种灵活的方式来简化驱动程序的开发, 使其能在实现对新硬件支持的基础上减少并降低所开发的驱动程序的数量和复杂性。WDM还必须为即插即用和设备的电源管理提供一个通用的框架结构。WDM是实现对新型设备的简便支持和方便使用的关键组件。

WDM模块化的体系结构和灵活统一的接口, 使操作系统可以动态地配置不同的设备驱动程序模块, 以支持不同的特定的设备。一个典型的驱动程序堆栈由通用设备、特定协议和特定总线的微型驱动程序联接的总线类驱动程序构成。

WDM驱动程序可以在Windows NT上与现有的Windows NT驱动程序共存。我们在开发这一新的WDM类驱动程序时采用了编写一次类驱动程序, 然后通过使用WDM的微型驱动程序来将其扩展成对应特定硬件接口的驱动程序。

1.2 驱动程序的作用

驱动程序是一个软件, 在装入后成为操作系统内核的一部分, 受到操作系统信任, 提供连接到计算机的软件接口。借助于驱动程序, 使用户应用程序能以一种规范的方式访问硬件, 而不必考虑如何控制硬件的细节。

在Windows2000/XP系统中, 允许多种不同种类的驱动程序存在并加以使用。图1列出了主要的驱动程序类型。

2 驱动程序的优化设计和实现

2.1 建立WDM编程环境

本文中进行优化设计的编程环境是在Windows XP操作系统下建立的。所以, 编译用的所有软件都是采用完全支持Windows XP的软件, 环境配置要求为:

DriverWorks

NuMega公司提供的DriverStudio是一个大的开发工具包, 包含VtoolsD、SoftICE和DriverWorks等开发工具。VtoolsD开发包提供了对VxD编程的C/C++类库支持, 利用VtoolsD中的QuickVxD工具可以快速生成VxD的C/C++代码框架, 开发者可以在此基础上根据需要添加代码。DriverWorks用于开发KMD和WDM驱动程序, 并且对DDK函数进行类的封装, 从而为开发Windows NT、Windows 2000和Widnwos98 WDM设备驱动程序提供支持。

DriverWorks提供了在VC++环境下的开发向导Driver Wizard, 按照它的提示可以迅速地生成驱动程序的框架。这个框架结构可以正确执行WDM动态环境中IRP的请求, 而且, 也包含了系统提供的标准类驱动程序 (如HID、流) 和总线驱动程序 (如PCI和USB) 接口的类等。总之, 利用DriverWorks开发WDM驱动程序, 可以大大简化开发人员的工作量以及降低开发难度。

建立了上述的WDM编程环境后, 在进行编程前, 还必须编译库文件, 库文件一般在DriverStudioDriverWorksSourcev dwlibs.dsw文件路径。

2.2 驱动程序的运行

驱动程序是运行在操作系统与应用程序之间的, 其作用是实现应用程序与操作系统间的交互。部分程序的流程如图2所示。

以下是驱动程序的主要组成部分。

(1) 设备的即插即用通知。RegisterDeviceNotification程序允许调用者对想要接收通知的类或设备进行精确过滤。这种过滤过程可以是具体的, 例如文件系统处理过程, 也可以是一般意义上的, 例如某一类设备等。如果使用Win32应用程序调用RegisterDeviceNotification函数注册, 则表示它想接收PnP设备变化的通知消息, 这个函数由SDK支持, 格式如下:

h Recipient是接受这个消息的窗口的句柄, 由于驱动程序本身不包含窗体程序, 所以先用CreateWindow () 函数创建一个虚拟的窗体, 返回一个可以使用的窗体句柄。

NotificationFilter是一个DEV_BROADCAST_DEVICEIN-TERFACE结构体对象, 这个结构包含了一类设备的基本信息。

Flags标志为DEVICE_NOTIFY_WINDOW_HANDLE或者DEVICE_NOTIFY_SERVICE_HANDLE。

窗口通知指的是带窗口的应用程序可以预定一条与特定GUID接口相关的WM_DEVICECHANGE消息, 这是一条扩充消息。注册RegisterDeviceNotification这个调用后, 只有在特定GUID接口允许或禁止时, 系统才发送WM_DEVICECHANGE消息。

当设备插入或者拔出时, 程序通过以上函数得到WM_DE-VICECHAN消息, 同时会产生2个事件:DBT_DEVICEAR-RIVAL和DBT_DEVICEARROVAL, 前者在msdn中定义的是一个设备被插入并且处在工作状态, 后者是一个设备被拔出。应用程序可以通过这2个事件判断设备的插入与拔出, 并调用相关的处理函数进行处理。

(2) 设备的枚举。USB设备是可热拔插的即插即用设备, 所以在一台计算机中, 可能同时有2个或2个以上的CreKey正在进行工作, 当有多个CreKey进行工作时, 就要对设备进行枚举, 对硬件的枚举是用GUID来找出设备路径的, 需要用同一组设备管理的API函数。

根据GUID取得一个和该GUID相关的一类设备的设备路径函数为:

根据GUID来枚举符合该GUID的设备接口函数为:

取得该设备的设备路径函数为:

关闭设备信息集句柄:

相关的2个结构:

(3) 建立设备链表。当通过以上API函数对CreKey设备进行枚举之后, 我们需要设计一个CreKey链表, 以用来存放每个CreKey的各种信息。设备的数据结构如下:

链表可以由用户创建及维护;也可以交给系统维护, 本设计中的链表由用户来维护, 用户使用模板类CArray (TYPE) 来维护设备链表, 链表的结构如下:

(4) 对设备的具体操作。本文涉及的USB硬件是一款基于USB协议的可读写的电子钥匙, 它的MCU芯片有4K大小, 也就是支持1024*4字节的读写。在Windows操作系统中, 各种硬件设备是被看作一个文件来访问的, 所以可用CreateFile函数打开设备并返回一个指向已打开设备的句柄, 这里有两个关键点: (1) CreateFile函数的第一个参数是设备路径, 一般情况下, 这函数的参数是可以从上述描述过的SetupDiGetInterfaceDeviceDetail () 中得到; (2) CreateFile函数是以同步方式打开设备的。若WDM以异步方式进行应用程序之间的通信, 则必须修改CreateFile函数中的第6个参数。

修改后, FILE_FLAG_OVERLAPPED才能以异步方式打开设备。在退出之前, 应当用CloseHandle函数关闭设备。

一般普通的读写操作是使用API函数Readfile () 和Writefile () , 但是它们仅仅只能完成读和写的工作, 功能比较单一。所以我们在设计中选择了SDK支持的函数DeviceIoControl () , 当应用程序调用它时, 驱动程序首先将此IRP保存起来, 然后调用I.MarkPending () , 返回STATUS_PENDING。当一个事件发生后, 驱动程序完成这个IRP。

(5) DLL封装。对于一个较大的应用程序, 常常将它按照功能分割成若干模板。每个模板独立编写并编译, 提供给其他模块使用的函数列表, 可以被映射到多个进程的地址空间。利用动态链接库可在二进制的级别上进行复用———把常用的独立功能包含在DLL中, 就可供其他应用程序、MFC调用。

DLL由4部分构成:代码段、数据段、输出符号表和输入符号表。代码段是只读的, 如果多个进程都链接到同一个DLL, 那么代码段将被映射到每个进程空间, 但可能会被映射到不同的地址。一旦映射成功, 该DLL中定义的函数就可被进程调用。

参考文献

[1]CHRIS CANT.WindowsWDM设备驱动程序开发指南[M].北京:机械工业出版社, 2005.

[2]MICROSOFT CORPORATION.Windows2000驱动程序开发大全[M].北京:机械工业出版社, 2004.

[3]武安河.Windows2000/XP WDM设备驱动开发[M].北京:电子工业出版社, 2005.

[4]张念淮, 江浩.USB总线接口开发指南[M].北京:国防工业出版社, 2005.

存储程序 篇4

我们在信息系统的设计和开发过程中,绝大部分信息系统要求显示图片和图像,譬如学籍管理系统要求学生的照片,教师评价系统要求老师的照片及各种考试报名系统要求考生的照片等等。因此不管我们用什么样的语言和数据库开发信息系统,都要解决图片和图像的处理问题。特别是随着web技术的发展,图像不在本地数据库上存储而是在远端服务器上进行存储,这样就给我们的图像处理带来的新的问题和难题。本文重点介绍基于.net,使用C#.NET语言在oracle数据库中存储图像的两种方法,供同行商榷。

2 存储模式的介绍和详细设计

我们介绍二种存储图像的方法,第一种方法是用数据库直接存取图片。就是将图片存放在数据库中(将BLOB值写入数据库),可以将二进制大对象(BLOB)作为二进制或字符数据写入数据库。但是用数据库直接存取图片,需要用到流,转换数据,这样有可能碰到一个问题,就是速度非常受影响。程序如下:

第二种方法,我们不采用数据库直接存储图片,而是存储名称和存放路径,将其放在文件系统中。我们首先将图片上传到服务器上的一个目录中,然后将传入数据库时存的是放置图片的路径和图片名称,最后读取图片的时候就是读数据库中的路径和文件名,再将页面上的图片指向该路径和文件名。程序如下:

3 两种存储模式的优劣比较

我们在实际应用这两种模式的过程中发现各有其利弊。第一种是直接再数据库中存储图像,而第二种是将图像放在文件系统中,我们来看看二者的利弊。我们知道oracle8i数据库中往往使用Blob来存储无结构的二进制数据,Blob大对象数据是数据量很大的数据类型,它会占用大量的硬盘空间、内存和网络资源,这是它的缺点;但是将图片存在数据库中也有其优点:

1)一致性较好,便于管理和备份。BLOB与其他数据是一起存储在数据库中的,数据便于一起备份和恢复,同时避免了数据与图像BLOB数据不同步的可能,也避免了在文件系统中被误删路径的风险。最重要的是,数据存储在数据库中,插入、更新和删除都在同一个事务中实现。这样就确保了所有数据在数据库中的一致性。

2)安全性好,不容易从网络上被盗取和删除。直接存储不需要为文件系统中的文件及文件夹单独设置安全性。

3)可伸缩性好,便于优化。尽管文件系统被设计为能够处理大量不同大小的对象,但是文件系统不能对大量小文件进行优化。而数据库系统则可以进行优化。

4)可复用性强。数据库具有比文件系统更多的可用性,数据库复制允许在分布式环境中复制、分配和潜在的修改数据。在主系统失效的情况下,日志转移提供了保留数据库备用副本的方法。而将图片放置在文件系统中,将导致不可预知的错误,甚至丢失。不过将图像存放在文件系统中也有它的优点:

1)能存储大图像文件,由于图像文件是上传到文件系统中指定的文件夹,所以不会受到文件尺寸大小的限制。

2)图片的维护和再利用比较方便,我们知道图片此时是作为单独文件存储的,对它使用其它三方工具进行重现、维护和管理就变得简单和方便了,不会因为在数据库中而访问不到。

综上所述,我们在设计过程中,如果没有特殊的要求,应该尽量采用压缩图片大小的方式,将图片和数据库存储在一起。否则就采用第二种方式。

摘要:该介绍基于.net开发环境下,使用C#语言编程工具实现两种在oracle数据库中存储图像的程序设计,并比较它们的优劣。

关键词:C#,图像,存储,Oracle数据库

参考文献

[1]侯晓霞.C#技术内幕[M].北京:清华大学出版社,2002.

[2]台湾恒逸资讯.C#与.net技术平台实战演练[M].北京:中国青年出版社,2002.

[3]王守茂.管理信息系统的分析与设计[M].天津:天津科技翻译出版公司,1993.

存储程序 篇5

关键词:LabVIEW软件,软件系统,设计方案

LabVIEW软件既具有通用性,又可嵌入标准C语言的动态链接库文件。使用LabVIEW软件进行程序设计,在设计形式上和其他高级编程语言不同。LabVIEW程序是借助数据流来驱动的,并用框图来代替其他语言中的编码,设计程序框图就是在编写程序代码。在LabVIEW软件中设计框图的过程,和在其他高级编程语言中设计流程图有相似之处,先利用其他高级编程语言的思想来设计程序流程图,再将流程图转化成框图,这个过程就相对容易多了。由此可见,一个好的设计方案和流程图设计对LabVIEW程序设计尤为重要。

1设计思路

根据该型存储测试仪软件系统的功能需求,可分为以下5大功能模块。采集数据模块、读取文件模块、显示波形模块、定标读值模块、波形输出模块。显示方式的选择和通道波形选择的控制穿插在各个模块当中。LabVIEW是采用基于流程图的图形化编程方式,是数据流驱动方式的开发环境,数据流驱动就是以数据为根本,当数据“流动”到哪个节点时,就执行该段程序(框图),没有流到的节点则不被执行。文件是数据的载体,在本软件中,设置一个文件标识变量file,fil是一个布尔类型变量。如果当前状态没有打开文件或采集到任何数据,file值为假,则所有模块不能响应(打开文件、采集数据和退出系统除外);如果执行了“打开文件”或“采集数据”操作,则file值为真,即可进行“显示波形”、“定标读值”、“波形输出”等操作。软件系统的流程图如图1所示。

2数据输入输出

数据是以文件的形式存储在计算机中的,LabVIEW软件为用户提供了一组文件I/O函数,专门用来进行文件处理。使用这些功能强大的文件I/O函数,可以进行所有关于文件输入输出的操作,主要包括以下几个方面:写入和读取数据、打开和关闭数据文件、重命名文件及目录、改变文件属性、读写电子表格文件、创建和读取配置文件等。

一个典型的文件I/O操作包括创建或打开一个文件、对文件做读写操作、关闭文件。打开一个文件时,必须指明该文件的路径,或指定路径来创建新的文件。文件打开后,LabVIEW软件会自动创建一个refnum标识,而此refnum标识为该文件处于打开状态的唯一标识号。最后,操作完毕后需要关闭文件,同时refnum标识会被自动释放。通常可以使用文本文件(Text Files)、二进制文件(Binary Files)和数据记录文件(Datalog Files)这3种文件格式进行数据存取操作。

2.1数据存储

数据文件的格式使用了二进制文件。使用LabVIEW中现有的VI来完成数据的保存,此VI名称为Write To I16 File。如图2所示。

参数说明:

file path:要保存的文件路径,如果未指定文件路径或文件路径为空,则LabVIEW弹出选择一个文件的对话框。

2D array:要保存到文件中的16位带符号的二维数组(1D array为空的情况下)。

1D array:要保存到文件中的16位带符号的一维数组(输入非空)。

append to file?:是否在文件末尾继续追加数据,如果为T,则在文件末尾追加数据;如果为F,则保存为新文件。

new file path:返回文件的路径。

2.2数据读取

二进制数据文件的读取使用了LabVIEW中现有的VI,此VI名称为Read From I16 File。如图3所示。

参数说明:

file path:要读取的文件的路径,如果未指定文件路径或文件路径为空,则LabVIEW弹出选择打开文件的对话框。

2D number of rows:数据返回二维数组创建的行数。默认值为0。

2D number of columns:数据返回二维数组创建的列数,或者是返回一维数组创建的元素数。默认值为1。

start of read offset:在文件中要读取数据的位置。

new file path:返回文件路径。

2D array:如果2D number of rows和2D number of columns定义了一个二维数组,则2D array是从文件中读取的带符号的16位整数。否则为空。

1D array:从文件中读取的一维数组,数组中数据位带符号的16位整数。

mark after read:读取完成后文件标记的位置。

EOF?:如果读取到文件结束,则该输出为True,否则为False。

2.3数据输出

根据功能需求,用户需要将数据波形打印输出。在程序设计中,使用Report.vi完成此项功能。在框图面板中,打开“Functions>Programming>Repot Generation”面板,即可找到Report.vi。在图标上单击鼠标右键,弹出快捷菜单,选择“Proper ties”项,即可打开“Configure Report”对话框,如图4所示。

参数说明:

Report Information包含以下内容:指定报告的标题;指定报告的作者;指定报告的公司名称;指定为报告产生数据的操作者的姓名;生成报告的时间和日期;报告的总页数和当前页码;报告的附加说明。

Data Input1包含以下内容:数据标题;是否包括数据波形;指定Y轴的标签;是否包括数据表格。

Data Input2包含以下内容:数据标题;是否包括数据波形;指定Y轴的标签;是否包括数据表格。

Destination:指定发送的目的地,发送到打印机或HTML的网页上。如果没有安装打印机,则以图形格式(.mdi)保存在本地磁盘上。

Path to save report:要保存报告的路径。

由Report.vi的参数信息可见,Report.vi最多可同时输出两个通道的数据波形。

3接口部分设计

LabVIEW程序提供了3种方式来实现通信驱动:直接端口读写方式、C语言调用方式和动态链接库调用方式。考虑到该型存储测试仪系统需求,利用直接端口读写方式来进行并口驱动设计。

直接端口读写方式(I/O方式)要使用两个端口读写VI:In Port.vi和Out Port.vi。打开LabVIEW中的框图面板中的函数模块,选择“Connectivity.>Port I/O”子模板,如图5所示。使用Port I/O子模板中的In Port.vi和Out Port.vi这两个代码接口节点来实现LabVIEW对PC机的并口进行驱动。In Port.v和Out Port.vi,这两个函数通过直接读写寄存器方式,完成从设备的物理地址直接读取和输出数据的功能。

In Port.vi:这个函数的功能是从指定的内存地址中读取一个8位、16位或32位的带符号整数。PC机并口的数据、状态、控制位的寄存器地址分别为378H、379H和37AH,所以只需将数据信号地址设置为378H,状态地址和控制地址在此基础上进行累加就可以了。Out Port.vi:该函数的作用是把一个带符号整数写入到指定的内存地址中,可以用这种多态模块对8位、16位和32位带符号整数进行操作。

4结语

利用LabVIEW软件实现了对某型存储测试仪软件系统的设计,设计了该型存储测试仪软件系统的流程图,阐述了软件系统的设计思路,并详细说明了软件系统中数据的存储、读取和输出设计方案。

参考文献

[1]杨乐平,李海涛,等.Lab VIEW高级程序设计.清华大学出版社,2004,8.

本文来自 360文秘网(www.360wenmi.com),转载请保留网址和出处

【存储程序】相关文章:

存储技术基础:存储虚拟化详解07-17

编写安全的SQL Server扩展存储过程存储过程06-20

存储保护05-10

存储设计05-17

安全存储05-18

分层存储05-22

存储管理06-04

分级存储06-08

云存储07-02

远程存储07-03

上一篇:小学语文个性化阅读下一篇:电子商务服务外包人才