我需要将列/数据类型对列表存储为应用程序设置。 列/数据类型对的数量大约为50 - 100,但可能更多。 由于客户要求,我无法将它们存储在表中。 用户可以在列表中添加/编辑/删除用户界面。
我最初想的是存储在app.config中的分隔字符串。 app.config中的密钥中存储的字符串大小是否存在实际限制?
有更好的方法吗?
[编辑以下sanjii的评论]是否可以读取/写入带有数据集的xml文件?
答案 0 :(得分:10)
我会将它们存储在XML文件中。您可以使用XML序列化或仅使用DataSet。
DSUser ds = new DSUser();
ds.ReadXml(fileName);
ds.AcceptChanges();
ds.WriteXml(fileName);
答案 1 :(得分:1)
由于这些设置在应用程序启动时被加载到内存中,因此可以安全地将值存储在适合内存的配置中。换句话说,就像你在C#中对字符串进行了硬编码一样(就内存利用率而言)。
作为替代方案,您的客户义务是否会排除使用SQLite之类的内容?
SQLite是一个软件库 实现一个独立的, 无服务器,零配置, 事务性SQL数据库引擎。 SQLite是部署最广泛的SQL 世界上的数据库引擎。该 SQLite的源代码在 公共领域。
答案 2 :(得分:1)
暂时不要放弃app.config / app-settings。
为了在我们的应用程序配置中存储更复杂的数据结构,我们采用了两种方法:如果我们尝试存储的数据结构可以序列化为XML,则我们将其作为字符串存储在app-settings中。另一种方法是实现TypeConverter
,将您的数据结构转换为字符串并返回。
这是一个裁剪的例子:
[TypeConverter(typeof(FormStateConverter))]
public class FormState : INotifyPropertyChanged, IDisposable {
private Size _Size = Size.Empty;
private Point _Location = Point.Empty;
private FormWindowState _WindowState = FormWindowState.Normal;
public FormState(Form form) { BindTo(form); }
internal FormState(Size size, Point location, FormWindowState state) {
_Size = size;
_Location = location;
_WindowState = state;
}
// lotsa other code...
}
internal class FormStateConverter : ExpandableObjectConverter {
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) {
if (destinationType == typeof(string)) {
return true;
} else {
return base.CanConvertFrom(context, destinationType);
}
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) {
if (sourceType == typeof(string)) {
return true;
} else {
return base.CanConvertFrom(context, sourceType);
}
}
// This converts a FormState to a string, we're just making a CSV string here...
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) {
if (destinationType == typeof(String)) {
FormState formState = (FormState)value;
string converted = string.Format("{0},{1},{2},{3},{4}", formState.Size.Height, formState.Size.Width,
formState.Location.X, formState.Location.Y, formState.WindowState.ToString());
return converted;
}
return base.ConvertTo(context, culture, value, destinationType);
}
// This converts a string back into a FormState instance.
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) {
if (value is string) {
string formStateString = (string)value;
string[] parts = formStateString.Split(','); // split the CSV string
if (parts != null && parts.Length == 5) { // attempt some error checking
Size size = new Size();
Point location = new Point();
FormWindowState state = FormWindowState.Normal;
int tmp;
size.Height = (Int32.TryParse(parts[0], out tmp)) ? tmp : 0;
size.Width = (Int32.TryParse(parts[1], out tmp)) ? tmp : 0;
location.X = (Int32.TryParse(parts[2], out tmp)) ? tmp : 0;
location.Y = (Int32.TryParse(parts[3], out tmp)) ? tmp : 0;
if (string.Equals(parts[4], "maximized", StringComparison.OrdinalIgnoreCase)) {
state = FormWindowState.Maximized;
} else if (string.Equals(parts[4], "minimized", StringComparison.OrdinalIgnoreCase)) {
state = FormWindowState.Minimized;
} else {
state = FormWindowState.Normal;
}
return new FormState(size, location, state);
}
}
return base.ConvertFrom(context, culture, value);
}
}
在实施类型转换器并将FormState
数据类型归因于TypeConverterAttribute
后,FormState
类型显示在Visual Studio中的“设置”设计器中:
答案 3 :(得分:0)
我还投票支持基于XML的设置解决方案。您可以在DotNetBlogEngine源代码中找到一个很好的示例。
它基于一个基本的Xml文件,一个单例设置类和一个用于读取和写入相关内容的SettingsProvider。 正确实施后,您需要做的就是调用设置类的实例;
ApplicationSettings.Instance.Name = "MyApplicationName";
ApplicationSettings.Instance.Description = "It's an awesome application";
ApplicationSettings.Instance.Theme = "LoveThemeofMGS";
ApplicationSettings.Instance.Save();
testlabel.Text = ApplicationSettings.Instance.Name;
testlabel2.Text = ApplicationSettings.Instance.Description;
我个人在大多数Web项目中使用它,这是一个简单而干净的解决方案。
答案 4 :(得分:0)
1)像大多数回答你问题的人一样 - 我认为使用某种基于XML的配置将是最方便的。我认为appconfig应该足够了。如果您需要Properties.Settings.Default,或者您只需要使用ConfigurationManager来完成一些更复杂的任务,那将取决于您。
2)如果要使用类型化数据集,则应使用xsd.exe工具(两者都有:Visual Studio Packaga和.Net Framework SDK)。这个小工具允许您从xml文件生成模式,从模式生成代码或类型化数据集。真有用。
3)如果考虑在内存数据库中使用...也许使用Microsoft的SQL Compact Server而不是SQLite会好得多? (请注意,有一些problems with dealing with date fields while using SQLite)