

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?
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.
Můžeš to trochu rozvést? Přistupuji k šabloně, namísto k instanci?
Teď jsem dal ten string public static a píše mi to chybu:
Member 'Form1.connectionString2' cannot be accessed with an instance reference; qualify it with a type name instead
Jak přesně jsi to změnil a kde přesně ti to píše?
No takhle. Už to funguje, ale nejsem z toho moc nadšený.
Trochu jinak. Dal jsem parametr připojení (conn) jako parametr konstruktoru formu:
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?
Není. Formulář by se o nějaké připojení neměl vůbec starat, to by měla být práce jiné vrstvy aplikace.
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č.
A máš v referencích System.Configuration.dll?
To bylo ono, teď ho zkusím přepsat.
To je.... to je.... peklo.
Uz to ale jede. Tak dik!