存储没有数据库的设置

时间:2009-09-25 15:17:56

标签: c# .net app-config

我需要将列/数据类型对列表存储为应用程序设置。 列/数据类型对的数量大约为50 - 100,但可能更多。 由于客户要求,我无法将它们存储在表中。 用户可以在列表中添加/编辑/删除用户界面。

我最初想的是存储在app.config中的分隔字符串。 app.config中的密钥中存储的字符串大小是否存在实际限制?

有更好的方法吗?

[编辑以下sanjii的评论]是否可以读取/写入带有数据集的xml文件?

5 个答案:

答案 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中的“设置”设计器中: alt text

答案 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