2009-09-25 6 views
0

Мне нужно сохранить список столбцов/типов данных в качестве параметров приложения. Количество пар столбца/типа данных будет около 50 - 100, но может быть больше. Я не могу хранить их в таблице из-за требований клиента. Для пользователя будет добавлен пользовательский интерфейс для добавления/редактирования/удаления из списка.Сохранение настроек без базы данных

Первоначально я думал о строке с разделителями, хранящейся в app.config. Есть ли практическое ограничение на размер строки, хранящейся в ключе в app.config?

Есть ли лучший способ?

[редактировать следующие комментарии sanjii] можно ли читать/писать xml-файл с набором данных?

ответ

10

Я бы сохранил их в XML-файле. Вы можете использовать XML-сериализацию или просто DataSet.

DSUser ds = new DSUser(); 
ds.ReadXml(fileName); 

ds.AcceptChanges(); 
ds.WriteXml(fileName); 
+2

+1 По-видимому, это идеальный сценарий для XML, хотя я предпочитаю простое сериализацию XML для параметра DataSet. –

+0

Я с @santiiiii (надеюсь, там достаточно, я там), но я сделал это для быстрой и грязной сериализации, и он отлично поработал. –

+0

Возможно ли, чтобы набор данных считывал запись в xml-файл? – callisto

1

Поскольку эти настройки загружаются в память при запуске приложения, вы можете хранить значения в конфигурации, которая будет вписываться в память. Другими словами, это точно так же, как если бы вы жестко закодировали строку в C# (насколько это касается использования памяти).

В качестве альтернативы ли ваши обязательства клиента исключают использование чего-то вроде SQLite?

SQLite библиотека программного обеспечения, которое реализует автономный, бессерверных, нулевую конфигурацию, транзакционного движка базы данных SQL. SQLite - это самый широко распространенный SQL-сервер базы данных SQL в мире. Исходный код для SQLite находится в общедоступном домене .

1

Не сдавайтесь app.config/app-settings пока еще.

Для хранения более сложных структур данных в нашей конфигурации приложения мы использовали два подхода: если структура данных, которую мы пытаемся сохранить, может сериализоваться в/из XML, мы сохраняем ее как строку в app- настройки. Альтернативой является реализация 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

+0

Примечание. Можно создавать пользовательские разделы appconfig, которые используют более сложные иерархические структуры. – Brian

+0

Вы правы. К сожалению, я только кратко читал об этом и не имел возможности реализовать что-либо. Есть ли хорошие ссылки, которые я должен соблюдать для будущего чтения? – Yoopergeek

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; 

Я лично использую это для большинства моих веб-проектов, это легко & чистое решение.

0

1) Как и большинство людей, которые ответили на ваш вопрос, я считаю, что использование какой-либо конфигурации на основе XML будет наиболее удобным. Я думаю, что appconfig должно быть достаточно. Это зависит от вас, если Properties.Settings.Default - это все, что вам нужно, или, возможно, вам нужно использовать ConfigurationManager только для более сложных задач.

2) Если вы хотите использовать типизированный набор данных, вы должны использовать инструмент xsd.exe (доступный как для Visual Studio Packaga, так и для .NET Framework SDK). Этот небольшой инструмент позволяет вам генерировать схему из XML-файла, а также код или типизированный набор данных из схемы. Действительно полезно.

3) Если вы считаете, что используете в базе данных памяти ... возможно, будет гораздо лучше использовать SQL Server SQL Server вместо SQLite? (имейте в виду, что есть некоторые problems with dealing with date fields while using SQLite)

Смежные вопросы