Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Dynamicky vytvořený connection ve formu

Ahoj,

trochu z toho začínám šedivět.
Mám v rodičovském formu vytvořený connection string (dynamicky).
V rodičovském formu funguje bezvadně.

 public string LoggedUser;
        public string LoggedUserPassword;
        public SqlConnectionStringBuilder connectionString2 = new SqlConnectionStringBuilder(); // dynamické připojení 2

        public Form1()
        {
            InitializeComponent();

            LoginForm loginForm = new LoginForm();

            loginForm.ShowDialog();
            LoggedUser = loginForm.UserName.Text;
            LoggedUserPassword = loginForm.UserPassword.Text;

            
            connectionString2.DataSource = @"127.0.0.1,1433";
            connectionString2.InitialCatalog = "DB";
            connectionString2.UserID = LoggedUser;
            connectionString2.Password = LoggedUserPassword;
            MessageBox.Show(connectionString2.ConnectionString); // tady vše funguje úplně ok (dotazy)
                        

A pak mám dětský formulář, kde potřebuji provést dotaz do DB.

To dělám následovně:

...  SqlConnection conn = new SqlConnection(((Form1)this.Parent).connectionString2.ConnectionString); // Tady to hňápne
            conn.Open();
            SqlDataReader rdr = null;

            SqlCommand cmd = new SqlCommand("SELECT TOP 10 * FROM Smlouvy ", conn);

Přičemž při pokusu vytvořit connection ve Formu2 (s referencí na rodičovský form1) to spadne.
Údajně není objekt nastaven na instanci objektu (která ale ve formu1 funguje skvěle).

Nenapadá někoho, kde je chyba? :-/

Předmět Autor Datum
Chyba je v nepochopení principů objektového programování. Nejrychlejší i když ne moc pěkné řešení je…
Wikan 21.09.2017 18:39
Wikan
Můžeš to trochu rozvést? Přistupuji k šabloně, namísto k instanci? Teď jsem dal ten string public s…
Flash_Gordon 21.09.2017 18:40
Flash_Gordon
Jak přesně jsi to změnil a kde přesně ti to píše?
Wikan 21.09.2017 18:48
Wikan
No takhle. Už to funguje, ale nejsem z toho moc nadšený. Trochu jinak. Dal jsem parametr připojení (…
Flash_Gordon 21.09.2017 18:52
Flash_Gordon
Není. Formulář by se o nějaké připojení neměl vůbec starat, to by měla být práce jiné vrstvy aplikac…
Wikan 21.09.2017 18:54
Wikan
Aplikace pracuje tak, že si vyžádá connection string2 na základě connection stringu1. Je to z bezpeč…
Flash_Gordon 21.09.2017 19:01
Flash_Gordon
A máš v referencích System.Configuration.dll?
Wikan 21.09.2017 19:06
Wikan
To bylo ono, teď ho zkusím přepsat. To je.... to je.... peklo. Uz to ale jede. Tak dik! poslední
Flash_Gordon 21.09.2017 19:13
Flash_Gordon

Chyba je v nepochopení principů objektového programování. Nejrychlejší i když ne moc pěkné řešení je označit ten connectionstring jako public static.
Mnohem hezčí by bylo odebrat práci s databází z Formů (tam totiž nemají co dělat) a dát ji do samostatné třídy (tříd) a ty si pak pomocí IoC do těch formů předávat.

No takhle. Už to funguje, ale nejsem z toho moc nadšený.
Trochu jinak. Dal jsem parametr připojení (conn) jako parametr konstruktoru formu:

 SqlConnection conn = new SqlConnection(connectionString2.ConnectionString);
            Smlouvy formSmlouvy = new Smlouvy(1025, conn); // formulář, první parametr je ID smlouvy, druhý "live" conn;
            formSmlouvy.Show();

A už můžu používat to připojení.
Jak to vidíš? Asi to není dobrá praktika předávat takto připojení každému formuláři, že? :-(

Aplikace pracuje tak, že si vyžádá connection string2 na základě connection stringu1.
Je to z bezpečnostního důvodu (prosím nerozvádět:-))

A ideální by bylo přepsat hlavní connection string runtime a k tomu přistupovat všude.

Tedy něco jako:

using System.Configuration;

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var connectionStrings = config.ConnectionStrings;
foreach (var connectionString in connectionStrings.ConnectionStrings)
{
// change connection details
}
config.Save(ConfigurationSaveMode.Modified);

Jenomže toto mi vůbec nefunguje, ani to nezná ConfigurationManager (include System.Configuration; mám)
Takže jsem nahraný. Nevím proč.

Zpět do poradny Odpovědět na původní otázku Nahoru