Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Runtime change ConnectionString, используя PropertyGrid и My.Settings. 
:(
    Опции темы
thomas
Дата 18.8.2007, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



Приветствую всех.
Для редактирования настроек программы использую PropertyGrid.
Настройки прописаны в MyProject -->Settings. Там я указал только названия, а значения оставил пустыми.
Студия создала app.config. Ну а настройки пользователя сохраняет в user.config. Соответственно сейчас действуют настройки Мои на моей машине.
Так вот когда программу установят у пользователя на машине, первым делом ему будет предложено ввести настройки.
Одна из которых это путь и имя  БД. Все это я реализовал, изменив класс сгенерированный студией
Код

'------------------------------------------------------------------------------
' <auto-generated>
'     This code was generated by a tool.
'     Runtime Version:2.0.50727.1378
'
'     Changes to this file may cause incorrect behavior and will be lost if
'     the code is regenerated.
' </auto-generated>
'------------------------------------------------------------------------------

Option Strict On
Option Explicit On


Namespace My
    
    <Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(),  _
     Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0"),  _
     Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)>  _
    Partial Friend NotInheritable Class MySettings
        Inherits Global.System.Configuration.ApplicationSettingsBase
        
        Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings),MySettings)
        
#Region "My.Settings Auto-Save Functionality"
#If _MyType = "WindowsForms" Then
    Private Shared addedHandler As Boolean

    Private Shared addedHandlerLockObject As New Object

    <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
    Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
        If My.Application.SaveMySettingsOnExit Then
            My.Settings.Save()
        End If
    End Sub
#End If
#End Region
        
        Public Shared ReadOnly Property [Default]() As MySettings
            Get
                
#If _MyType = "WindowsForms" Then
               If Not addedHandler Then
                    SyncLock addedHandlerLockObject
                        If Not addedHandler Then
                            AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
                            addedHandler = True
                        End If
                    End SyncLock
                End If
#End If
                Return defaultInstance
            End Get
        End Property
        
        <Global.System.ComponentModel.CategoryAttribute("Application"), _
         Global.System.Configuration.ApplicationScopedSettingAttribute(), _
         Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
         Global.System.Configuration.SpecialSettingAttribute(Global.System.Configuration.SpecialSetting.ConnectionString), _
         Global.System.Configuration.DefaultSettingValueAttribute("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""D:\MyProjects\MAIL ID\Mailing1\Mail" & _
         "ing.mdb""")> _
        Public ReadOnly Property MailingConnectionString() As String
            Get
                Return CType(Me("MailingConnectionString"), String)
            End Get
        End Property
        
        <Global.System.ComponentModel.CategoryAttribute("User"), _
         Global.System.ComponentModel.DescriptionAttribute("Map waar Excel bestanden zich bevinden."), _
         Global.System.Configuration.UserScopedSettingAttribute(), _
         Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
         Global.System.Configuration.DefaultSettingValueAttribute(""), _
         Global.System.ComponentModel.EditorAttribute(GetType(clsPathEditor), GetType(System.Drawing.Design.UITypeEditor))> _
        Public Property DirectoryExcelFiles() As String
            Get
                Return CType(Me("DirectoryExcelFiles"), String)
            End Get
            Set(ByVal value As String)
                Me("DirectoryExcelFiles") = value
            End Set
        End Property
        
        <Global.System.ComponentModel.CategoryAttribute("User"), _
         Global.System.ComponentModel.DescriptionAttribute("Map waar Mailing Request bestanden zich bevinden."), _
         Global.System.Configuration.UserScopedSettingAttribute(), _
         Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
         Global.System.Configuration.DefaultSettingValueAttribute(""), _
         Global.System.ComponentModel.EditorAttribute(GetType(clsPathEditor), GetType(System.Drawing.Design.UITypeEditor))> _
        Public Property DirectoryRequestFiles() As String
            Get
                Return CType(Me("DirectoryRequestFiles"), String)
            End Get
            Set(ByVal value As String)
                Me("DirectoryRequestFiles") = value
            End Set
        End Property
        
        <Global.System.ComponentModel.CategoryAttribute("User"), _
         Global.System.ComponentModel.DescriptionAttribute("Map waar Mailing Response bestanden zich bevinden."), _
         Global.System.Configuration.UserScopedSettingAttribute(), _
         Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
         Global.System.Configuration.DefaultSettingValueAttribute(""), _
         Global.System.ComponentModel.EditorAttribute(GetType(clsPathEditor), GetType(System.Drawing.Design.UITypeEditor))> _
        Public Property DirectoryResponseFiles() As String
            Get
                Return CType(Me("DirectoryResponseFiles"), String)
            End Get
            Set(ByVal value As String)
                Me("DirectoryResponseFiles") = value
            End Set
        End Property
        
        <Global.System.ComponentModel.CategoryAttribute("Application"), _
         Global.System.ComponentModel.DescriptionAttribute("AccountID die U van de Post hebt gekregen."), _
         Global.System.Configuration.UserScopedSettingAttribute(), _
         Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
         Global.System.Configuration.DefaultSettingValueAttribute("")> _
        Public Property AccountID() As String
            Get
                Return CType(Me("AccountID"), String)
            End Get
            Set(ByVal value As String)
                Me("AccountID") = value
            End Set
        End Property
        
        <Global.System.ComponentModel.CategoryAttribute("Application"), _
         Global.System.ComponentModel.DescriptionAttribute("CustomerID die U van de Post hebt gekregen."), _
         Global.System.Configuration.UserScopedSettingAttribute(), _
         Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
         Global.System.Configuration.DefaultSettingValueAttribute("")> _
        Public Property CustomerID() As String
            Get
                Return CType(Me("CustomerID"), String)
            End Get
            Set(ByVal value As String)
                Me("CustomerID") = value
            End Set
        End Property
        
        <Global.System.ComponentModel.CategoryAttribute("Application"), _
         Global.System.ComponentModel.DescriptionAttribute("Naam van database bestand die zal gebruikt worden in dit programma."), _
         Global.System.Configuration.UserScopedSettingAttribute(), _
         Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
         Global.System.Configuration.DefaultSettingValueAttribute(""), _
         Global.System.ComponentModel.EditorAttribute(GetType(clsFileNameEditor), GetType(System.Drawing.Design.UITypeEditor))> _
        Public Property DataBase() As String
            Get
                Return CType(Me("DataBase"), String)
            End Get
            Set(ByVal value As String)
                Me("DataBase") = value
            End Set
        End Property
    End Class
End Namespace

Namespace My
    
    <Global.Microsoft.VisualBasic.HideModuleNameAttribute(),  _
     Global.System.Diagnostics.DebuggerNonUserCodeAttribute(),  _
     Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()>  _
    Friend Module MySettingsProperty
        
        <Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")>  _
        Friend ReadOnly Property Settings() As Global.Mailing1.My.MySettings
            Get
                Return Global.Mailing1.My.MySettings.Default
            End Get
        End Property
    End Module
End Namespace
'Global.System.Configuration.DefaultSettingValueAttribute("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""D:\MyProjects\MAIL ID\Mailing1\Mail" & _
'   "ing.mdb""")> _

Типа там разбил настройки по категориям, сделал кнопочки для выбора имени файла, выбора директории. Для этого написал пару классов.

Осталась только одна проблема как в первое свойство
Public ReadOnly Property MailingConnectionString() As String
подсунуть значение свойства
Public Property DataBase() As String
вот в эту строку
Код

Global.System.Configuration.DefaultSettingValueAttribute("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""D:\MyProjects\MAIL ID\Mailing1\Mail" & _
         "ing.mdb""")> _


У кого нибудь есть идеи?


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
SpaceSpace
Дата 20.8.2007, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 2
Всего: 10



а не проще изменять конфиг файл? xml, тоесть?


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
thomas
Дата 20.8.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



SpaceSpace, 
Спасибо, очень ценный совет. И главное по существу.   smile 
Название темы посмотрите  smile 

Это сообщение отредактировал(а) thomas - 20.8.2007, 22:04


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Idsa
Дата 21.8.2007, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(thomas @  20.8.2007,  22:03 Найти цитируемый пост)
Название темы посмотрите

Хм... Действительно, а что тебе мешает изменять ConfigurationManager["connnectionStringName"] в Runtime?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
thomas
Дата 21.8.2007, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



Idsa, 
Приветствую.
Цитата

Действительно, а что тебе мешает изменять ConfigurationManager["connnectionStringName"] в Runtime? 

Мешает то, что ConfigurationManager работает с такой формой app.config. Это FW1.1.
Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="contype" value="provider=Microsoft.Jet.oledb.4.0; data source="/>
        <add key="pad" value="D:\vti\Margo\"/>
        <add key="db" value="cyberpro.mdb"/>
    </appSettings>
</configuration>

А я имею вот такой app.config
Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="Mailing1.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <connectionStrings>
        <add name="Mailing1.My.MySettings.MailingConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=&quot;D:\MyProjects\MAIL ID\Mailing1\Mailing.mdb&quot;"
            providerName="System.Data.OleDb" />
    </connectionStrings>
    <system.diagnostics>
        <sources>
            <!-- This section defines the logging configuration for My.Application.Log -->
            <source name="DefaultSource" switchName="DefaultSwitch">
                <listeners>
                    <add name="FileLog"/>
                    <!-- Uncomment the below section to write to the Application Event Log -->
                    <!--<add name="EventLog"/>-->
                </listeners>
            </source>
        </sources>
        <switches>
            <add name="DefaultSwitch" value="Information" />
        </switches>
        <sharedListeners>
            <add name="FileLog"
                 type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
                 initializeData="FileLogWriter"/>
            <!-- Uncomment the below section and replace APPLICATION_NAME with the name of your application to write to the Application Event Log -->
            <!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
        </sharedListeners>
    </system.diagnostics>
    <userSettings>
        <Mailing1.My.MySettings>
            <setting name="DirectoryExcelFiles" serializeAs="String">
                <value />
            </setting>
            <setting name="DirectoryRequestFiles" serializeAs="String">
                <value />
            </setting>
            <setting name="AccountID" serializeAs="String">
                <value />
            </setting>
            <setting name="Email" serializeAs="String">
                <value />
            </setting>
        </Mailing1.My.MySettings>
    </userSettings>
</configuration>


Как говориться, почувствуйте разницу.  smile  Используется пространство имен My и вкладка Settings  в свойствах проекта.

И потом сам подумай.
Если пишеться "взрослая" программа, для стороннего использования, то не красиво предлагать пользователю искать using.config и изменять в нем connectionString.(Потому как настройки пишутся в этот файл, а не в app.config) Юзверь может и понятия не иметь,  а что такое  xml. Он может даже путь к папке и имя файла в ручную не умеет писать. Поэтому я предусмотрел возможность через диалог указывать директории для файлов и пусть с именем файла базы данных.

Единственное что мне не нравиться с использованием Settings и My, так это то, что мелкомягкие не предусмотрели прямой возможности как-то апосредованно влиять на application settings в runtime. Приходиться искать обходные пути.

Ведь сам посуди. Пользователь может и должен указать свою базу данных, которую он будет пользовать. А программа автоматом , на основании полученной инфы, исправляет connection string. Ведь пользователь по идее и не должен знать что, такое провайдер данных и  вообще что такое connection string.  smile  Он знает что есть база, он её указал и ВСЕ - процесс пошел.  smile 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Jlekc
Дата 21.8.2007, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 520
Регистрация: 10.2.2005
Где: Leopolis

Репутация: 1
Всего: 4



а почему не использовать:
Код

Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
// тут используя SectionGroups и Sections добраться до необходимой информации
cfg.Save();



--------------------
PM MAIL ICQ   Вверх
SpaceSpace
Дата 21.8.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 2
Всего: 10





thomas
почитай про конфигурирование приложений.
классы Configuration  , ConfigurationManager

хорошая книга - основы разработки приложений на платформе .NET Framework 

мелкосфты не такие идиоты, чтобы не давать возможноси делать свои конфиги

Это сообщение отредактировал(а) SpaceSpace - 21.8.2007, 09:43


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
thomas
Дата 21.8.2007, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



Короче, я так понимаю, никто ничего дельного подсказать не может.  smile 

 smile 
Первый раз был вынужден создать в дизанере ДатаСет. Этот супер пупер ДатаСет должен иметь  connection string.  Он его поимел. Студия сохранила это  connection string в app.config. Через My.Settings я могу его увидеть, к примеру в PropertyGrid. А дальше полная ... .
В runtime этот ...  connection string  не установить. А при разработке программы, сохраняется тот который был установлен на машине разработчика. Следовательно пользователь программы может долго ждать когда ему программа, установленная на его машине, отобразит данные из супер пупер ДатаСета, с connection string машины разработчика.

Вот почему я так ненавижу дизайнер.  

Цитата

мелкосфты не такие идиоты, чтобы не давать возможноси делать свои конфиги

Да, они не идиоты, они сделали My.Settings. Настройки категории пользователя(user) все просто замечательно. А вот категория application - попробуй, и ты увидишь сам какая это ... . 

ЗЫ

SpaceSpace, 
Цитата

классы Configuration  , ConfigurationManager

В первом FW это пространство имен и обьект. Во втором есть такие классы, но они работают "по старинке" как в первом FW
вот с таким файлом app.config (configurationmanager)
Код

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="NewKey0" value="Monday, January 23, 2006 2:56:14 PM" />
    <add key="NewKey1" value="Monday, January 23, 2006 3:15:18 PM" />
    <add key="NewKey2" value="Monday, January 23, 2006 3:16:29 PM" />
  </appSettings>
</configuration>

А отсюда ты хоть ... , но connection string  супер пупер ДатаСету не подсунешь.
А проблема только с этим. 
КАК подсунуть нужный connection string ДатаСету?  smile 

Это сообщение отредактировал(а) thomas - 21.8.2007, 22:29


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
thomas
Дата 22.8.2007, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



Я конечно не Магомед, а Microsoft не гора. Но
Если гора не идет к Магомеду, то  ... пошла на фиг, такая гора.  smile 

В общем так, после долгих поисков я решил просто проигнорировать connection string который создал дизайнер ДатаСета.
Как говориться "забил болт на это дело".
Сначала в Settings.Designer.vb  дописал функцию
Код

Public Function SetUserOverride() As String
            Me("MailingConnectionString") = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Chr(34) & Me.DataBase & Chr(34)
            Return Me("MailingConnectionString").ToString()
        End Function

А потом в MyDataSet.Designer.vb заменил строку, сгенерированную студией, на мою
Код

<Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _
        Private Sub InitConnection()
            Me._connection = New Global.System.Data.OleDb.OleDbConnection
            'Me._connection.ConnectionString = Global.Mailing1.My.MySettings.Default.MailingConnectionString
            Me._connection.ConnectionString = Global.Mailing1.My.MySettings.Default.SetUserOverride()
        End Sub

Соответственно этот супер пупер ДатаСет получает connection string  основанный на базе данных, которую указал пользователь при первом старте программы.

Может не самое корректное и эстетичное решение  smile  , но оно работает.  smile 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Jlekc
Дата 22.8.2007, 11:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 520
Регистрация: 10.2.2005
Где: Leopolis

Репутация: 1
Всего: 4



thomas, всеже я не понял почему ты решил что невозможно изменить app.config на лету, используя средства M$

Исходный конфиг:
Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="NorthwindConnectionString"
            connectionString="Data Source=LEX\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>


Полученый конфиг:
Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="NorthwindConnectionString" connectionString="Data Source=NULL"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>


и пару строк кода:
Код

ExeConfigurationFileMap fm = new ExeConfigurationFileMap();
fm.ExeConfigFilename = Path.Combine(Path.GetDirectoryName(typeof(Program).Assembly.Location), "app.config");

Configuration cfg = ConfigurationManager.OpenMappedExeConfiguration(fm, ConfigurationUserLevel.None);
cfg.ConnectionStrings.ConnectionStrings["NorthwindConnectionString"].ConnectionString = "Data Source=NULL";
cfg.Save(ConfigurationSaveMode.Modified);



--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.