Jak przechowywać informacje o bazie w pliku?

0

Witam.

Czasami tworzę na swoje potrzeby proste aplikacje wykorzystujące dane z SQL Server (Visual Studio 2012).
Używam tutaj połączeń do bazy przez standardowe połączenie w 'Data sources' - w którym informacje o bazie zmieniam przez edytowanie połączenia, oraz kodu np jak ten:

SqlConnection connection = new SqlConnection(@"Server=SERWER;Initial Catalog=BAZA;uid=user;pwd=haslo");
SqlCommand command = new SqlCommand("procedura", connection);
            command.CommandType = CommandType.StoredProcedure;
            connection.Open();
            command.ExecuteNonQuery();
            connection.Close();

I tutaj po prostu poprawiam ręcznie w kodzie.

Co za tym idzie - kiedy chcę uruchomić aplikację na innym serwerze bazodanowym, czy chociażby innej bazie - muszę wszystko skompilować jeszcze raz i poprawić dane w dwóch miejscach... (połączenia z datasources wykorzystuję jak chcę po prostu przenieść tabelkę i upuścić w aplikacji, wygodne bardzo; ręcznie piszę kiedy potrzebuję uruchomić jakąś procedurę albo odpalić zapytanie...)

Chciałbym utworzyć plik konfiguracyjny w którym przechowywane byłyby dane bazy SQL Server, aby zmiana bazy czy serwera nie wymagała ingerowania w kod programu. Można osiągnąć coś takiego w w miarę prosty sposób?

Pozdrawiam.

Łukasz

0

Jeżeli nie zależy ci zbytnio na bezpieczeństwie to wpakuj po prostu plaintext do pliku i go czytaj.

4

W każdym standardowym pliku konfiguracyjnym aplikacji .NET (czyli app.config lub web.config) jest sekcja "connection strings", na której można łatwo operować przy użyciu klasy ConfigurationManager.
Szczegóły tutaj: http://msdn.microsoft.com/en-us/library/ms254494%28v=vs.110%29.aspx

0

Dziękuję Wam bardzo, dokładnie o taką odpowiedź mi chodziło, już działa jak powinno :-)

0

To jeszcze jedno pytanie w tym temacie. Mając poniższy kod:

SqlConnection connection = new SqlConnection(@"SERVER=SRV; USER ID=sa; PASSWORD=12345; DATABASE=CDNXL_2012; CONNECTION RESET = FALSE");
        //SqlConnection connection = new SqlConn ection(ConfigurationManager.ConnectionStrings["2012ConnectionString"].ConnectionString);
         public Aktualizator()
        {
            InitializeComponent();
        }
        public void importdatafromexcel(string excelfilepath)
        {
            string sqltable = "dbo.LK_Prog_TwrAktualizacja";
            string myexceldataquery = "select Kod, Nazwa, Nazwa1, SAP, EAN, Rodzaj, Kategoria, Marka, Grupa, Producent, Waga, CenaKatalogowa, GrupaDrzewo, PCN, URL, KategoriaRynkowa, ProductManager, Archiwalny FROM [Towary$]";
            try
            {
                string excelconnectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + excelfilepath + "';Extended Properties='Excel 8.0;HDR=yes;IMEX=1'";
                //string sqlconnectionstring = "SERVER=SRV; USER ID=sa; PASSWORD=12345; DATABASE=CDNXL_2012; CONNECTION RESET = FALSE";
                string cleartable = "DELETE FROM " + sqltable;
                SqlConnection sqlconnection = new SqlConnection(ConfigurationManager.ConnectionStrings["2012ConnectionString"].ConnectionString);
                SqlCommand sqlcmd = new SqlCommand(cleartable, sqlconnection);
                sqlconnection.Open();
                sqlcmd.ExecuteNonQuery();
                sqlconnection.Close();
                OleDbConnection excelconnection = new OleDbConnection(excelconnectionstring);
                OleDbCommand OLEDBCMD = new OleDbCommand(myexceldataquery, excelconnection);
                excelconnection.Open();
                OleDbDataReader dr = OLEDBCMD.ExecuteReader();
                SqlBulkCopy BULKCOPY = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["2012ConnectionString"].ConnectionString);
                BULKCOPY.DestinationTableName = sqltable;
                while (dr.Read())
                {
                    BULKCOPY.WriteToServer(dr);
                }
                excelconnection.Close();
            }
            catch (Exception EX)
            {
                MessageBox.Show(EX.ToString());
            }
        }

Co przeoczyłem, że linię:

SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["2012ConnectionString"].ConnectionString) 

mogę zastosować w funkcji importdatafromexcel, a gdy chcę użyć jej wyżej, zamiast bezpośredniego podawania stringu połączenia, dostaję "Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu"?

EDIT:
Jeśli ktoś będzie to przeglądał i natrafi na podobny problem - chodziło o nazwę. W konfiguracji mam "AktualizatorTowarowy.Properties.Settings.2012ConnectionString", a próbowałem użyć "2012ConnectionString". No i nie mogę zastosować w importfromexcel - po prostu na etapie kompilacji wydaje się ok ;)

  • informacyjnie - kiedy mam już działający plik z informacją o połączeniu, jakie znaczenie ma zapis w settings:
        [global::System.Configuration.DefaultSettingValueAttribute("Data Source=srv;Initial Catalog=CDNXL_2012;Persist Security Info=Tru" +
            "e;User ID=sa;Password=12345")]

Powinienem coś z tym zrobić...? Samo otwarcie okna Settings wyświetla błąd "an error occurred while reading the app.config file. the file might be corrupted", pomimo którego aplikacja działa bez problemu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1