数据库应用程序通用客户端配置工具的设计与实现
2015-09-01王玉国王忠良
王玉国,王忠良
(通化师范学院 计算机学院,吉林 通化 134002)
目前数据库应用程序的开发都是采用分层体系结构,数据库和应用程序是分开的,数据库部署在服务器端,应用程序部署在客户端,目的是提高数据的共享性和独立性[1], 便于系统的开发和维护.应用程序和数据库的连接是通过“连接字符串”来提供信息的.连接字符串由一系列用分号隔开的“名称=值”对组成的,设置内容取决于希望连接的数据源,以及采用的技术[2].主要内容包括希望连接到的数据源实例名字、用户名和密码、默认数据库和集成安全性等信息.连接字符串的配置是每个数据库应用程序都要面对的,笔者设计的通用客户端配置工具就是用来配置连接字符串的,适用于所有基于.NET的数据库应用程序的开发.
1 连接字符串部署存在的问题
许多基于.NET的数据库应用程序开发者,他们或者把连接字符串存放在应用程序中,或者存储在配置文件中[3].
把连接字符串存放在应用程序中,优点是简单,缺点是不灵活.当应用程序的运行环境发生变化时,就要修改客户端应用程序,非常不方便.
把连接字符串存储到配置文件中,客户端应用程序运行时读取配置文件中的连接字符串,这种方法非常灵活、方便.当应用程序的运行环境发生变化,直接修改配置文件,而不用修改应用程序,就能适应运行环境变化.但这种做法也存在一个问题,就是连接字符串的信息暴露在外,登录到数据库的信息没有加密,降低了系统的安全性.
通过上面的讨论可知:连接字符串的部署应具有灵活性和安全性.另外,连接字符串的部署问题是数据库应用程序设计中的一个普遍问题,应具有通用性.通用客户端配置工具能够解决这些问题.
2 通用客户端配置工具的设计与实现
2.1 通用客户端配置工具的工作原理
通用客户端配置工具的工作原理如图1所示.通用客户端配置工具根据用户输入的配置信息形成连接字符串,测试成功后进行加密,将加密后的连接字符串写入客户端应用程序配置文件中.这里的客户端配置文件指的是以.config为扩展名的XML文件.客户端应用程序的各个子系统均可以读取配置文件中加密的连接字符串,解密后用于自身到服务器的连接字符串.
图1 通用客户端配置工具工作原理
通用客户端配置工具的通用性含义是指可以为各个数据库应用程序配置连接信息并存储到配置文件中,提供一个通用的处理方案.
2.2 通用客户端配置工具的界面设计
通用客户端配置工具的界面应该能提供用户输入完成登录的全部信息,适应所有情况,实现通用性.
客户端应用程序到服务器的连接有两种类型,一种是信任连接,一种是非信任连接.信任连接是指只要该用户成功登录到Windows操作系统,就可以登录到SQL Server服务器,不用再次输入用户名和口令.而非信任连接要求登录到SQL Server时再次输入用户名和口令.配置工具的界面上应该允许用户选择登录的连接类型.根据登录需要,还应该允许用户输入配置文件名称、服务器或数据源名称、数据库名称、用户名和密码.具体工作界面如图2所示.
图2 通用客户端配置工具界面
图3 客户端配置工具工作流程图
“配置文件”项是用来输入配置文件的名称,该文件用来存储加密之后的连接字符串信息.“服务器名”项用来输入数据源,具体格式是“服务器名或IP地址实例名”.“数据库名”项用来输入登录后访问的数据库名字.
当用户选择信任连接时,“登录名”和“口令”两项被禁输入.“建立连接”是一个命令按钮,单击完成配置工作.
2.3 通用客户端配置工具的实现
当用户输入相关信息后,单击“建立连接”按钮完成配置工作.配置工作的流程图如图3所示.
用户根据数据库应用程序、应用环境输入相应配置信息,单击“建立连接”按钮后,该工具首先对用户输入的配置信息进行合法性检查.如果不合法,要求用户进行修改,如果合法则组合成连接字符串.然后测试一下能否连接到数据源,具体做法是建立SqlConnection对象,将该连接字符串作为连接属性值,调用Open方法后判断State属性值,如果值是ConnectionState.Open枚举值,则能连接到数据源.
最后一项工作是加密并写入配置文件.该工作被封装成一个用户自定义函数encryptString,该函数有两个参数,一个存放连接字符串,另一个存放配置文件名称.函数中首先定义了密钥,然后定义字节数组,通过内存流实施加密.最后将加密之后的字符串,即密文写入配置文件.具体函数内容如下:
private void encryptString(string myString,string configFileName)
{
string myEncryptKey = "1314";
string encryptStrCnn;
DESCryptoServiceProvider myDesc = new DESCryptoServiceProvider();
byte[] Key = Encoding.Unicode.GetBytes(myEncryptKey);
byte[] encryptData = Encoding.Unicode.GetBytes(myString);
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, myDesc.CreateEncryptor(Key, Key), CryptoStreamMode.Write);
cStream.Write(encryptData, 0, encryptData.Length);
cStream.FlushFinalBlock();
encryptStrCnn = Convert.ToBase64String(mStream.ToArray());
string fileName = Application.StartupPath + @"”+configFileName;
ExeConfigurationFileMap myMap = new ExeConfigurationFileMap();
myMap.ExeConfigFilename = fileName;
try
{
ConnectionStringSettings mySettings = new ConnectionStringSettings("strCnn", encryptStrCnn);
Configuration myConfig = ConfigurationManager.OpenMappedExeConfiguration(myMap, ConfigurationUserLevel.None);
if (myConfig.ConnectionStrings.ConnectionStrings["strCnn"] != null)
myConfig.ConnectionStrings.ConnectionStrings.Remove("strCnn");
myConfig.ConnectionStrings.ConnectionStrings.Add(mySettings);
myConfig.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("Connectionstrings");
}
catch (Exception x)
{
MessageBox.Show(x.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
3 通用客户端配置工具的应用
当开发一个数据库应用程序时,可将通用客户端配置工具作为客户端系统的一个子系统来使用.第一次运行应用程序或配置环境发生变化时,都要运行通用客户端配置工具来配置应用环境.这是一款为所有基于.NET数据库应用程序而设计的客户端配置工具,所以称为通用客户端配置工具.有了这款工具,方便了数据库应用程序的开发,使程序更具有灵活性,并且增加了对环境的适应性.