目录
介绍
创建数据库对话框
打开数据库对话框
背景
使用代码
显示数据库对话框
加密
序列化
构建演示应用程序
遗漏
从Github下载源代码
介绍本文介绍了一些用于创建和打开SQL数据库的便捷对话框。
它们支持以下SQL数据库提供程序:
- SQLite
- Microsoft SQL Server
- PostgreSQL
- MySQL
上面的数据库提供程序已被广泛使用,并且具有供私人和商业使用免费的版本。SQLite通过本地连接支持多个用户(但不支持并发写入)。其他提供程序通过本地和远程连接支持多个用户。
对话框允许用户配置以下基本连接属性:
- 数据库名称
- 数据库位置
- 数据库服务器位置(本地/远程)
- 用户认证类型
- 用户名和密码
显然,并非所有数据库提供程序都支持上述所有属性。
数据库设置与注册表进行序列化,并选择使用简单算法对密码进行加密。
对话框类使用依赖注入来允许开发人员在需要时提供自己的加密和序列化机制。
本文包括一个示例应用程序,该应用程序允许创建和维护一个简单的数据库来存储真菌物种记录。该应用程序使用PetaPoco库来简化记录的创建、编辑和删除。
示例应用程序的主窗口如下:
显然,单击按钮将显示打开的数据库对话框和新的数据库对话框。
创建数据库对话框SQLite选项允许用户如下创建本地数据库文件:
Microsoft SQL Server选项允许用户如下创建本地数据库文件:
PostgreSQL服务器选项允许用户如下创建本地或远程数据库文件:
MySQL Server选项允许用户如下创建本地或远程数据库文件:
SQL Server,PostgreSQL和MySQL选项具有一个复选框,允许以加密形式保存用户名和密码。
打开数据库对话框SQLite选项允许用户打开存储在文件中的本地数据库,如下所示:
SQL Server选项允许用户按以下方式打开本地或远程数据库:
Windows身份验证和SQL Server身份验证均受支持。不支持附加数据库。这可以通过Microsoft SQL Server Management Studio应用程序完成。
PostgreSQL选项允许用户从本地或远程服务器打开数据库,如下所示:
Windows身份验证和PostgreSQL身份验证均受支持。
MySQL选项允许用户按以下方式打开本地或远程数据库:
您需要非常熟悉C#和WPF的基本知识。
使用代码 显示数据库对话框在本节中,我将说明如何使用示例应用程序中的代码显示新的数据库对话框。创建和显示打开的数据库对话框几乎相同。有关详细信息,请参见示例应用程序。
首先,创建以根注册表项路径作为参数传递的RegistryItemSerialiser类的实例:
OpenControls.Wpf.Serialisation.RegistryItemSerialiser registryItemSerialiser =
new OpenControls.Wpf.Serialisation.RegistryItemSerialiser(_keyPath);
此类用于读取和写入注册表项。
创建DatabaseConfiguration类的实例,并将RegistryItemSerialiser实例作为参数传递给它:
OpenControls.Wpf.DatabaseDialogs.Model.DatabaseConfiguration databaseConfiguration =
new OpenControls.Wpf.DatabaseDialogs.Model.DatabaseConfiguration(registryItemSerialiser);
在DatabaseConfiguration类存储数据库设置,以及串行化他们和使用提供的串行器实例的注册表。
接下来打开注册表项,如果成功,则加载数据库设置:
if (registryItemSerialiser.OpenKey())
{
databaseConfiguration.Load();
}
如果尝试打开注册表项失败,请不要担心,如果路径不存在是期望的结果。
最后,创建NewDatabaseView和NewDatabaseViewModel类的实例并显示对话框:
OpenControls.Wpf.DatabaseDialogs.ViewModel.NewDatabaseViewModel newDatabaseViewModel =
new OpenControls.Wpf.DatabaseDialogs.ViewModel.NewDatabaseViewModel(databaseConfiguration);
OpenControls.Wpf.DatabaseDialogs.View.NewDatabaseView newDatabaseView =
new OpenControls.Wpf.DatabaseDialogs.View.NewDatabaseView(
new OpenControls.Wpf.DatabaseDialogs.Model.Encryption());
newDatabaseView.DataContext = newDatabaseViewModel;
if (newDatabaseView.ShowDialog() != true)
{
return;
}
请注意,以上代码创建了Encryption类的实例,该实例用于在序列化期间加密和解密密码,并将其作为参数提供给NewDatabaseView构造函数。如果不需要密码加密,则可以传递一个null值。
当用户单击“确定”按钮时,保存数据库对话框设置,然后打开请求的数据库:
if (!registryItemSerialiser.IsOpen)
{
registryItemSerialiser.CreateKey();
}
databaseConfiguration.Save();
registryItemSerialiser.Close();
try
{
OpenControls.Wpf.DatabaseDialogs.Model.DatabaseProvider databaseProvider =
(OpenControls.Wpf.DatabaseDialogs.Model.DatabaseProvider)
newDatabaseViewModel.SelectedDatabaseProvider;
// Now open the database ...
加密
密码在序列化过程中由Encryption类的实例加密和解密,该实例实现了简单的默认加密算法。如果愿意,可以使用自己的加密算法。为此,请创建一个实现IEncryption接口的类,并将该类的实例传递给NewDatabaseView 和OpenDatabaseView构造函数。
IEncryption接口定义如下:
public interface IEncryption
{
string Encrypt(string rawPassword);
string Decrypt(string encryptedPassword);
}
序列化
数据库设置由DatabaseConfiguration类的实例存储。
在示例代码中,设置通过RegistryItemSerialiser类的实例与注册表进行序列化。如果需要,可以将设置序列化为其他实体,例如文本文件或数据库。为此,只需创建一个实现IConfigurationSerialiser接口的新类并将该类的实例传递给DatabaseConfiguration构造函数即可。
IConfigurationSerialiser接口被定义为如下:
public interface IConfigurationSerialiser
{
void WriteEntry(string name, T value);
T ReadEntry(string name, T defaultValue);
}
构建演示应用程序
在构建演示应用程序之前,您需要还原Nuget软件包。转到解决方案资源管理器视图,将鼠标光标移到解决方案的标题栏上,单击鼠标右键,然后选择“还原NuGet软件包”菜单项:
现在应该可以直接构建和运行WpfFungusApp应用程序。
遗漏添加对其他数据库提供程序的支持应该相当简单(尽管很耗时)。
对话框不执行高级数据库设置。如果需要,则必须修改它们,例如,添加一个高级设置按钮,按下该按钮将显示一个高级设置对话框。
对话框不允许附加Microsoft SQL Server数据库。使用Microsoft SQL Server Management Studio应用程序可以轻松完成此操作。