Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > ConnectionString и VS2008


Автор: lokiVan 5.4.2008, 14:56
Всех привествую.

Обращаюсь к вам в надежде получить помощь.
Появилась насущная проблема перевода проекта на платформу VS2008. Столкнулся с такой проблемой.

На старой платформе при подключении во время загрузки формы считывалось имя сервера и подставлялось в ConnectionString

Код

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data;
using System.Security.Principal;
using System.DirectoryServices;


private void Form1_Load(object sender, System.EventArgs e)
{
WindowsIdentity t = WindowsIdentity.GetCurrent();
string txt = t.Name.ToString();
string[] SimpleSentences;
SimpleSentences = txt.Split('\\');
for(int i=0;i<SimpleSentences.Length;i++)
str += SimpleSentences[0].ToString();
}



Код


this.oleDbConnection1.ConnectionString = @"Integrated Security=SSPI;Packet Size=4096;Data Source=(local);Tag with column collation when possible=False;Initial Catalog=PROJECT;Use Procedure for Prepare=1;Auto Translate=True;Persist Security Info=False;Provider=""SQLOLEDB.1"";Workstation ID="" + str + "";Use Encryption for Data=False";



В Восьмой студии (да и в пятой тоже, походу), я так понял необходимо плясать от Setting.cs. 
Т.е. прописывать строку соединения там, а потом обращаться к ней из Settings.Designer.cs

 http://forum.vingrad.ru/topic-132285.html
Здесь мне показалось обсуждалась похожая проблема, но дальше осознания сути проблемы не продвинулся.
Сутки ломаю голову уже больше суток smile 
Уповаю на вашу помощь!!!!!!!! 

Автор: mr.DUDA 5.4.2008, 16:00
Допустим, в проекте есть настройки Setting.cs, строка соединения лежит в настройке под именем MyConnectionString (соответственно, есть свойство Setting.Default.MyConnectionString), имя пользователя там прописано как User1.

Теперь добавляем в проект новый класс, пишем код:
Код
using System;
using System.Security.Principal;

namespace WindowsApplication1
{
    partial class Setting
    {
        protected override void OnSettingsLoaded(object sender, System.Configuration.SettingsLoadedEventArgs e)
        {
            base.OnSettingsLoaded(sender, e);

            MyConnectionString = MyConnectionString.Replace("User1", WindowsIdentity.GetCurrent().Name)
        }
    }
}

Автор: lokiVan 5.4.2008, 17:09

С Вашего позволения разложу по полочкам.

По умолчанию создается строка соединения PROJECTConnectionString 

Вместе с ней создается   Settings.cs

Код

namespace PROJECR_2008.Properties {

    public sealed partial class Settings {
        
        public Settings() {
        }
        private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
        }
        private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) {
        }
    }
}


В теле кода Settings.Designer.cs генерируется код под конкретную строку подключения

Код

namespace PROJECR_2008.Properties {
    
    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
    public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
        
        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
        
        public static Settings Default {
            get {
                return defaultInstance;
            }
        }
        
        [global::System.Configuration.ApplicationScopedSettingAttribute()]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)]
        [global::System.Configuration.DefaultSettingValueAttribute("Data Source=XXX-XXX\\;Initial Catalog=PROJECT;Integrated Security=True")]
        public string PROJECTConnectionString {
            get {
                return ((string)(this["PROJECTConnectionString"]));
            }
        }
    }
}


Если я правильно понимаю, то по сути должна происходить замена значения строки подключения по умолчанию на значение заданное в классе Class1.cs
Не разобрался только куда нужно поставлять содержимое класса. 


Код

using System;
using System.Security.Principal;
namespace WindowsApplication1
{
    partial class Setting
    {
        protected override void OnSettingsLoaded(object sender, System.Configuration.SettingsLoadedEventArgs e)
        {
            base.OnSettingsLoaded(sender, e);
            MyConnectionString = MyConnectionString.Replace("User1", WindowsIdentity.GetCurrent().Name)
        }
    }
}


Извиняюсь за твердолобость. За студией сидел последний раз 4 года назад (А тут еще отличия от .net) 
Чувствую придется наверстывать.

Автор: mr.DUDA 5.4.2008, 20:03
Класс добавляется командой "Add New Item... / Class". Содержимое будет таким:
Код
using System;
using System.Security.Principal;

namespace PROJECR_2008.Properties
{
    partial class Settings
    {
        protected override void OnSettingsLoaded(object sender, System.Configuration.SettingsLoadedEventArgs e)
        {
            base.OnSettingsLoaded(sender, e);

            this["PROJECTConnectionString"] = PROJECTConnectionString + ";User ID=" + WindowsIdentity.GetCurrent().Name + ";Password=123";
        }
    }
}

Или примерно таким же, зависит от способа подключения к SQL Server.

Вот линк на примеры строки соедиения: http://www.connectionstrings.com/?carrier=sqlserver2005

Автор: lokiVan 5.4.2008, 20:35
Благодарю за ответ.

В теле класса-то все понятно.Как раз то что надо.  
Не понятно как его воткнуть вот сюда,чтобы заменить существующее подключение

 
Код

        [global::System.Configuration.ApplicationScopedSettingAttribute()]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)]
        [global::System.Configuration.DefaultSettingValueAttribute("Data Source=XXX-XXX\\;Initial Catalog=PROJECT;Integrated Security=True")]
        public string PROJECTConnectionString {
            get {
                return ((string)(this["PROJECTConnectionString"]));
            }
        }


я предполагал что это будет выглядеть  приблизително следующим образом. Тут используются My.MySettings заданные ранее
Мне казалось что аналогично должно было бы быть и в моем случае...

Код

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


Раньше просто создавал строку туда закидывал текущее имя сервака и приклеивал к текущей строке подключения.
А как чер класс реализовать  smile ....  

Можно создать отдельное подключение, повесить на событие и т.п. Но на формах программы навешано крайне много активных текстовых полей. Не хотелось бы все прописывать вручную. Было бы здорово просто изменить сгенирированный на автомате connectingString, а потом работать с ним стандартными средствами Студии. 




Автор: mr.DUDA 6.4.2008, 09:43
Автосгенерированный код будет заменяться студией с потерей изменений, внесённых вручную. Так что это неподходящий вариант.

Автор: lokiVan 6.4.2008, 11:22
Это я тоже понимаю. 
Ладно пока ручками все пропишу. Потом покапаюсь в этом вопросе.
Большое спасибо за помощь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)