第九章访问数据
设计计算机的目的是处理数据的,因此,很少有程序不需要访问数据,既可以是读很小的配置文件,还可以是访问一个全面的关系数据库管理系统。在这一章,我们将广泛学习在 F# 中的访问数据。
不管什么时候执行用 .NET 语言写的应用程序,.NET 运行时都会自动检查是否存在配置文件。这个文件的名字与可执行文件名相同,再加上扩展名 .config,文件必须放在与可执行文件相同的目录中。比如, MyApp.exe 的配置文件就是MyApp.exe.config。在 ASP.NET 应用程序中,由于没有可执行文件,配置文件叫 web.config,在这个网站的根目录中。配置文件用来保存设置,改变这些设置不需要重新编译应用程序。一个典型的例子就是数据库的连接字符串。应该注意,不要在配置文件中保存针对某个用户的值,因为,对配置文件的任何修改,都会影响应用程序的所有用户。保存特定用户设置的最好位置是关系型数据库。我们会在本章后面的“ADO.NET”一节讨论更多有关关系数据库访问的内容。
System.Configuration 命名空间提供了很容易的方法来访问配置值,最简单的方法是用ConfigurationManager 访问配置数据。下面的例子演示如何从配置文件中装载简单的键-值对;假设已有下面的配置文件,准备读“MySetting”值:
<configuration>
<appSettings>
<add key="MySetting"value="An important string" />
</appSettings>
</configuration>
下面的代码用 ConfigurationManager 的静态属性 AppSettings 加载设置:
open System.Configuration
// read an application setting
let setting =ConfigurationManager.AppSettings.["MySetting"]
// print the setting
printfn "%s" setting
[
添加配置文件:右击项目,单击添加新建项,在常规模板中,选择应用程序配置文件。默认文件名:App.config。
]
前面代码的运行结果如下:
An important string
注意
要编译这个程序,必须添加对System.dll 的引用。在 .NET 1.1 中访问这些值是用 System.dll 中的 ConfigurationSettings 类型,在 .NET 2.0 中,这个类型仍然保留,但已经不被推荐,最好不用。
键-值对最常用的是保存连接字符串,习惯做法是,把它单独作为一节,有助于和其他配置分隔开来。providerName 属性可以保存有关连接字符串应该使用哪一个数据库提供程序的信息;
下面的例子演示如何从配置文件中加载连接字符串“MyConnectionString”:
<configuration>
<connectionStrings>
<add
name="MyConnectionString"
connectionString=" Data Source=server;
Initial Catalog=pubs;
Integrated Security=SSPI;"
providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
下面的代码通过 ConfigurationManager 类的另一个静态属性 ConnectionString 加载连接字符;这是一个集合,能访问类型 ConnectionStringSettings,它有一个ConnectionString 属性用于访问连接字符串,ProviderName 属性用于访问提供程序:
open System.Configuration
// get the connection string
let connectionStringDetails =
ConfigurationManager.ConnectionStrings.["MyConnectionString"]
// print the details
printfn "%s\r\n%s"
connectionStringDetails.ConnectionString
connectionStringDetails.ProviderName
代码的运行结果如下:
Data Source=server;
Initial Catalog=pubs;
Integrated Security=SSPI;
System.Data.SqlClient
警告
我在配置文件中加上了空格、回车,以增加可读性,这些也作为连接字符串,可以看到这也被输出到控制台了。大多数库函数使用这个连接字符串时都会改正,但是,也有些可能不会改正,因此,在格式化配置文件时要小心。
还可以加载与另外应用程序、网站应用程序相关联的配置文件,甚至是 machine.config,machine.config 保存了在特定机器上 .NET 的默认配置,可以查询、修改并保存这些文件。
下面的例子演示如何打开 machine.config,并枚举其中的各节内容:
open System.Configuration
// open the machine config
let config =
ConfigurationManager.OpenMachineConfiguration()
// print the names of all sections
for x in config.Sections do
printfn "%s"x.SectionInformation.Name
代码的运行结果如下(不同的机器会有不同的结果):
system.data
windows
system.webServer
mscorlib
system.data.oledb
system.data.oracleclient
system.data.sqlclient
configProtectedData
satelliteassemblies
system.data.dataset
startup
system.data.odbc
system.diagnostics
runtime
system.codedom
system.runtime.remoting
connectionStrings
assemblyBinding
appSettings
system.windows.forms
这一节介绍了如何使用配置文件,这是一种特殊的 XML 文件;后面的有一节System.Xml 命名空间,将会介绍如何使用System.Xml 命名空间处理各种的 XML 文件。下一节,我们将将讨论使用 System.IO 命名空间访问文件。
System.Configuration 命名空间