在Micro Focus Visual COBOL中用ADO.NET进行数据访问
Micro Focus Visual COBOL是一个现代化的开发包,它使开发人员能够维护、创建和升级他们的系统,以简化应用程序的开发和交付。Visual COBOL是一个多语言集成开发环境(IDE)。
ADO 是微软的一项技术,代表了 。它是一个ActiveX Data ObjectActiveX控件的集合,使你能以编程方式访问微软最新的数据访问技术。
简单地说,ADO在编程语言和数据库之间充当了一个中间件。开发人员编写程序来访问数据,而不知道数据库是如何实现的。
ADO.NET 是一个编程元素的集合,允许程序员从数据库中检索数据和数据服务。
通常,程序员访问和改变关系型数据库系统(RDBMS)中的数据,但他们也可以从非关系型数据源中检索数据。
第一类语言由.NET 框架的API支持。.NET ,可以使用API访问现有的类,而不必重新发明轮子来访问数据。
它本质上是一套访问和操作流程,开发者可以利用它来获取他或她的数据。
最好的部分是,你不需要安装任何东西,因为它已经包含在.NET 框架中。
前提是
- 安装[Visual Studio Code]。
- 在Visual Studio代码编辑器中添加[Microfocus COBOL扩展]。
- 有一些关于数据库管理的背景资料。
目标
在本教程结束时,读者将理解。
- 如何在ADO.NET中建立一个与数据对象的链接。
- 创建有助于使用Micro Focus Visual Studio访问数据对象的命令。
什么是数据对象?
数据对象实际上是一个存储区域,它持有一个值或一组值。每个值都可以通过使用一个对象的标识符作为变量来访问。
此外,每个对象都有其数据类型。
比如说。
- 产品、销售和客户是销售数据库的数据对象的例子。
- 病人可能是一个医疗数据库的对象。
- 学生、教授和课程可能是大学数据库的对象。
基本的ADO流程
我们将首先看一下什么是SQL Server's namespace ,管理数据访问。
在本文的最后,我们将介绍不同的数据提供者。
命名空间是一组符号,通常用于区分和联系不同类型的对象。
由于命名空间的存在,每一个特定的对象集合都会有唯一的名称,使它们能够被轻易地识别。
System.Data.SqlClient是要记住的名字空间,如果你想连接到SQL Server。SQL服务器的 数据提供者就位于这个命名空间中。.NET
为了在.NET 框架中连接到SQL服务器,你将从编写命名空间开始。
using System.Data;
using System.Data.SqlClient;
目前,在SQLClient命名空间中有16个类。这些类提供了一种程序化的方式来建立与数据库的连接,验证权限,管理异常,以及做其他与数据访问有关的工作。
让我们开始使用ADO。
要查看数据对象,请遵循这个基本程序。
- 建立一个与数据对象的链接。
- 为数据对象创建一个命令,让其采取行动。
- 读取由数据对象返回的数据。
为了完成上面列出的动作,我们需要导入以下类。
- System.Data.SqlClient.SqlConnection
- System.Data.SqlClient.SqlCommand
- System.Data.SqlClient.SqlDataReader
准备工作
对于本教程,我们将使用一个安全的控制台应用程序。
微软的数据访问技术(ADO.NET应用程序)是安全控制台应用程序的一种。它是.NET 框架的一部分,将.NET 应用程序连接到各种数据源。
它可以访问各种基本数据流--标准输入、标准输出和标准错误。
开始,我们声明变量并初始化它们。其中一个保存连接属性,另一个保存SQL语句。
在工作存储区,你会发现所有数据项的记录和数据描述条目(通常被称为数据项描述条目)。
根据IBM的说法,工作存储区描述的数据记录不是数据文件的一部分,而是由一个程序或方法开发和处理的。它还描述了那些在源程序或方法中被分配了值并且在对象程序执行过程中不发生变化的数据项。
工作-存储部分是一个工作场所,所有的命令都写在上面,如下图所示。

sqlConnection type System.Data.SqlClient.SqlConnection.
sqlDataReader type System.Data.SqlClient.SqlDataReader.
sqlCommand type System.Data.SqlClient.SqlCommand.
这些是基本的对象,它们将使我们能够连接到数据库引擎,并获取有关操作的信息。
除了现有的功能字段外,我们还增加了用于存储数据的字段。
下面是完成的工作-存储部分的内容。
sqlConnection type System.Data.SqlClient.SqlConnection.
sqlDataReader type System.Data.SqlClient.SqlDataReader.
sqlCommand type System.Data.SqlClient.SqlCommand.
sqlCmd string.
dataFound type System.Boolean.
recordsRead pic 9(06) value zeros.
LastName pic x(20) value spaces.
FirstName string.
HomePhone pic x(24) value spaces.
junk pic x(01) value spaces.
从上面的代码中,我们声明持有的变量。
sqlDataReader type System.Data.SqlClient.SqlDataReader中的数据。sqlConnection type System.Data.SqlClient.SqlConnection中的连接属性,以及sqlCommand type System.Data.SqlClient.SqlCommand中的SQL命令。- 命令
dataFound type system.Boolean,用于调用sqlDataReader,返回true或false。 recordsRead pic x(20) value spaces自定义要读取的数据的长度。- 在接下来的三行代码中,我们声明了用于定制PIC子句的变量
FirstName, LastName, and HomePhone。 - 最后一行代码结束了声明过程,提示其他垃圾文件不应超过声明变量的限制。
值得注意的是,我们可以混合和匹配数据定义的类型。一些变量是使用PIC子句的典型COBOL语法定义的,而另一些则是使用标准的
.NET数据类型定义的。
通过启用这个选项,我们不需要担心数据类型转换的问题。
在许多编程系统中,PIC条款被用来允许用户定制文本的打印或呈现方式。它描述了一个基本项目的一般特征和编辑要求。
要改变一个PIC子句,用户必须输入各种文本组合的字符,如增加字母或格式化一段文本。
创建一个连接
要使用一个数据库,我们必须首先建立一个连接。
当使用ODBC-嵌入式SQL时,我们必须首先在ODBC管理员面板中建立连接,然后再发出SQL连接查询。
Administrative Tools 要建立ODBC连接,在Control Panel ,然后在Administrative Tools (ODBC)下点击Data Sources 。
建立ODBC连接很复杂。
在ADO中,连接的方式明显要简单得多。
ADO的一个主要优点是,我们不再需要在ODBC管理面板中配置连接。
相反,我们只需构建数据库连接字符串,创建一个数据库连接,并为新对象调用Open 方法。
在我们的例子中,连接可以按照下面的代码来设置。
set sqlConnection to new type System.Data.SqlClient.SqlConnection.
set sqlConnection::ConnectionString to
"Data Source=WIN8VC23\SQL12DEV;Initial Catalog-Northwind;User ID-sa;Password-NFUSER;MultipleActiveResultsSets=True".
invoke sqlConnection::Open().
从上面的代码来看。
- 我们创建一个新的SQLConnection对象,名称为
sqlConnection。 - 然后,连接字符串属性被设置为连接的参数。
- 然后使用
sqlConnection的Open方法来建立连接。
在连接字符串中,我们已经指定了用户ID、密码和我们试图连接的数据库。
包含连接字符串的工作区变量可以被创建并传递给设置连接的方法。
创建一个命令
现在我们已经创建了我们的连接,我们需要通知数据库我们要完成的任务。
早些时候,我们会使用EXEC SQL SELECT * FROM EMPLOYEES END-EXEC ,从Employees数据库中获取数据。
雇员数据库包含了我们先前在Preparation heading 中声明的变量。
现在,利用学到的知识,创建一个简单的数据库Employee database ,其字段为FirstName, LastName, HomePhone 。
我们将在我们的教程中使用这个数据库。
set sqlCmd to "SELECT FirstName, LastName, HomePhone FROM Employees".
set sqlCommand to new type System.Data.SqlClient.SqlCommand(sqlCmd, sqlConnection).
set sqlDataReader to sqlCommand::ExecuteReader.
上面的代码提示连接只获取与雇员有关的细节。然后,第二行指定了与System.Data.SqlClient.SqlCommand 命名空间的连接。
我们创建了一个工作存储变量来保存来自Select 语句的数据。一个SQL命令实例sqlCommand ,必须在命令字符串生成后才能建立。
一个SQL命令类唯一必要的参数是一个连接对象。你必须指定执行命令的地点和执行的命令。
ExecuteReader 命令将被用来执行和返回数据。
因此,你将得到一个数据读取器对象,可以用来访问数据。
读取数据
一个数据库连接已经建立。
当我们运行执行连接的命令时,数据应该已经被返回。
你怎么知道是否有数据被返回?
我们将使用Read 方法从数据阅读器对象中获取数据。这个方法会产生一个布尔值的结果,表明数据是否被读取。
DataFound 将通过在读取语句中添加一个返回行来设置,然后检查我们是否有任何来自文件系统的数据。
使用Perform 语句是因为我们可能不知道我们所处理的数据的大小。
在这个函数中,我们使用 "GetString",它返回一个字符串到我们先前指定的变量。
永远记住,在处理数组时,
.NET使用零索引。
下面的代码有助于读取数据。
set dataFound to true.
move zero to recordsRead.
invoke sqlDataReader::Read returning dataFound.
perform with test before until dataFound not equal to true
invoke sqlDataReader::GetString(0) returning FirstName
invoke sqlDataReader::GetString(1) returning LastName
invoke sqlDataReader::GetString(2) returning HomePhone
add +1 to recordsRead
display "Record: ", recordsRead, "Name: ", FirstName, " ",LastName," ", HomePhone
invoke sqlDataReader::Read returning dataFound
end-perform.
从上面的代码中,我们调用数据读取器来读取我们先前在Preparation 标题中声明的变量的所有数据值。
例如,阅读器读取字符串(FirstName、LastName和HomePhone),然后使用代码display "record: " ,显示它们的记录。
如果我们没有任何数据需要处理,我们就不会运行Perform循环。
Perform循环包含三个GetString 调用,返回雇员的名、姓和家庭电话。
我们跟踪我们已经读取了多少条记录,并使用控制台来显示最近的一条。
最后,我们检查是否有更多的数据需要处理。如果我们有更多的数据需要处理,我们要么重复这个方法,要么退出执行循环。
当你运行示例程序时,应该会显示以下数据。

有什么不对劲的地方吗?
也许,这幅图有什么不对劲。
相比之下,在姓氏和电话号码之间有太多的空间,而在名字和姓氏之间则刚好够。
为什么呢?
在一个受管理的环境中工作并使用受管理的代码类型提供了几个好处。其中之一是环境能够以更加结构化和清晰的方式呈现信息。
Working-storage将名字指定为一个字符串实体,将姓氏指定为一个正常的COBOL数据类型,即PIC X(20) 。
数据会根据非空格字符的数量自动进行缩放。
COBOL数据类型所定义的字符量被显示出来,在这个例子中是20 。
内务处理
在处理完所有的信息后,Perform 循环被终止了。
我们必须在终止程序之前关闭数据阅读器和连接。
在控制台上,我们显示一条信息,并等待用户按下Enter 键来退出。
下面是内务管理代码。
invoke sqlDataReader::Close().
invoke sqlConnection::Close().
display "Press enter to exit...".
accept junk from console.
goback.
- 上述代码中的第一行关闭了我们在
Read data标题下启动的SQL数据阅读器。 - 第二行关闭了我们先前在
create connection标题下创建的SQL数据库连接。 - 第三行代码显示对话框,提示用户点击
Enter键来执行上面的两行命令。
其他数据提供者
本文演示了如何使用ADO for SQL Server来访问数据。
Oracle和IBM都为各自的数据库环境给出了管理命名空间,允许类似的功能。
如果你和Oracle打交道,你需要ODP .NET ,或者Oracle Data Provider for.NET 。
对于IBM,必须安装IBMData Server Provider for .NET。
如果你使用IBM DB2 ,你将与IBM.Data.DB2 ,如果你使用Informix ,你将与IBM.Data.Informix 。
包裹它
在微软.NET 环境中的数据访问可以节省时间,使操作自动化,并简单地显示数据。
本文提供的步骤应该有助于你理解处理要求。
本文演示了如何手工开发基于ADO的软件。
此外,Micro Focus还提供了一个ADO Connection Editor 和一个OpenESQL 工具,用于开发支持SQL的源代码作为额外的支持。
结语
在这篇文章中,我们已经学会了如何用ADO.NET访问数据。
在Micro Focus Visual COBOL中,我们还学习了基本的ADO数据流、准备工作、如何创建连接、创建命令、读取数据、了解什么是内务管理,以及了解其他数据提供者。