Toon posts:

[VB.NET] Dynamische database maken

Pagina: 1
Acties:
  • 104 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben (nog steeds) bezig met een fotoboek-programma. Dit programma is nu zo goed als af, maar nu ben ik aan de details bezig.

Het programma doet aan een soort van controle tegenover een database. Momenteel is die verbinding met de database statisch.
Ik heb nu echter ook een "configuratie" gedeelte in mijn programma waarin de gebruiker alle informatie voor de SQL-server kan opgeven (DSN, Username, pwd). Ik zou dus graag een dynamische database-verbinding opzetten.

Hiervoor probeerde ik het volgende:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    Private Sub Groepsnaam_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim xmlTr As New XmlTextReader("XMLConfig.xml")
        While xmlTr.Read
            If xmlTr.Name = "SQL-server" Then
                DSN.Text = "data source=" + xmlTr.ReadString + ";initial catalog=lokersefeesten;password=******" & _
                "U;persist security info=True;user id=username;workstation id=THISCOMPUTER;pack" & _
                "et size=4096"
            End If
        End While

        Me.SqlConnection1.ConnectionString = DSN.Text

        SqlDataAdapter1.Fill(DataSet1)
        DataSet1.WriteXml("groupList.xml")
    End Sub


Ik weet dat de naamgevingen niet echt perfect te noemen zijn en dat het nog niet af is maar dit was maar als test, en dit werkt al niet. Even uitleggen:

Ik lees uit de xml-file de sql-server (DSN) en maak de connectionstring die ik opsla in de textbox DSN. Nadien wil ik dan de connectionstring aanpassen naar die DSN.Text. Het idee is volgens mij wel correct, maar toch doet ie het niet. Als ik de DSN.Text laat displayen is die nochthans correct. Kan iemand me wat uitleg geven aub :?

Trouwens moesten jullie het je afvragen, dingen als SqlDataAdapter1 etc worden wel statisch gedefinieerd en staan dus correct in InitializeComponents()

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Waarom zet je de hele connectionstring niet in de web.config, en laat je je applicatie die connectionstring gebruiken die in je Web.Config staat?
Als je databank van 'plaats' veranderd, hoef je enkel die conn.string in je web.config aan te passen.

Als je met andere DB providers wilt werken (Sql Server, Oracle, ...), dan kan je eens kijken naar het Data Access Block van MS.
Ik heb ooit ook eens zoiets gemaakt:
[rml][ Alg|.NET] Design van een generiek DbHelper object[/rml]

[ Voor 9% gewijzigd door whoami op 01-07-2004 11:40 ]

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:27

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 01 juli 2004 @ 11:39:
Waarom zet je de hele connectionstring niet in de web.config, en laat je je applicatie die connectionstring gebruiken die in je Web.Config staat?
Als je databank van 'plaats' veranderd, hoef je enkel die conn.string in je web.config aan te passen.

Als je met andere DB providers wilt werken (Sql Server, Oracle, ...), dan kan je eens kijken naar het Data Access Block van MS.
Ik heb ooit ook eens zoiets gemaakt:
[rml][ Alg|.NET] Design van een generiek DbHelper object[/rml]
Zou ook leuk zijn om die discussie verder te voeren en dan ook het 'Provider' pattern, zoals MS nu wil invoeren, er bij te betrekken en hier al dan niet een variant op te maken. :)
Ik lees uit de xml-file de sql-server (DSN) en maak de connectionstring die ik opsla in de textbox DSN. Nadien wil ik dan de connectionstring aanpassen naar die DSN.Text. Het idee is volgens mij wel correct, maar toch doet ie het niet. Als ik de DSN.Text laat displayen is die nochthans correct. Kan iemand me wat uitleg geven aub
Waarom noem je hem .xml en niet .config ? Dan is deze automatisch 'beschermd' en een logische naam. Werk je trouwens met Webforms of winforms?

[ Voor 25% gewijzigd door gorgi_19 op 01-07-2004 11:43 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
gorgi_19 schreef op 01 juli 2004 @ 11:42:
[...]

Zou ook leuk zijn om die discussie verder te voeren en dan ook het 'Provider' pattern, zoals MS nu wil invoeren, er bij te betrekken en hier al dan niet een variant op te maken. :)
Ik ken dat provider pattern (nog) niet?
MS met al hun patterns & practices. Onmogelijk om alles te volgen aan dit tempo. :/

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20:27

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 01 juli 2004 @ 11:49:
Ik ken dat provider pattern (nog) niet?
MS met al hun patterns & practices. Onmogelijk om alles te volgen aan dit tempo. :/
Het is ook een variant c.q. verdere uitwerking van een Abstract Factory. De combinatie ligt hem dat de .dll met de precieze uitwerking aangegeven staat in je web.config file en door middel van reflection dynamisch geladen wordt.

Om te voorkomen dat de boel te zeer wordt vertraagd, wordt de assembly dmv System.Web.Caching gecached, zodat de performancehit verwaarloosbaar wordt. :)

Maar dit was een klein beetje offtopic, maar de TS heeft er misschien wat aan. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Even voor de volledigheid, ik werk met een windows-programma, geen web-pagina. Ik gebruik die .xml om daarin de configuratie van mijn programma op te slaan en wil daaruit dan ook alles halen voor de connectionstring. Ik snap alleen niet waarom mijn manier niet wil werken. Gebruik van andere types databases is niet nodig, enkel DSN, Username, PWD en Database moeten aangepast kunnen worden.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Als je een gewone windows-app hebt, dan kan je ook een configuratie-file toevoegen. (Check de opties eens in VS.NET; je config file geef je dan de naam appname.exe.config.

Wat is niet werken trouwens? Krijg je een exeptie

https://fgheysels.github.io/


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-05 08:21
Ik doe altijd het volgende:

Maak een app.config file aan met de volgende inhoud:
code:
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="path" value="C:\Documents and Settings\Remco\Bureaublad\bladiebla.mdb" />
<add key="userid" value="admin" />
<add key="password" value="" />
</appSettings>
</configuration>

Nu maak ik ook nog een module aan connect.vb
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Module connect
    Public Connectie As OleDb.OleDbConnection
    Public Connectiestring As String
    Public config As Configuration.ConfigurationSettings


    Public Sub connect()
        Try
            ' Create the Connection object
            Connectie = New OleDb.OleDbConnection
            ' Build the connection string
            Connectiestring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
            Connectiestring &= config.AppSettings("path")
            Connectiestring &= ";User Id="
            Connectiestring &= config.AppSettings("userid")
            Connectiestring &= ";Password="
            Connectiestring &= config.AppSettings("password")
            Connectiestring &= ";"
            ' Set the Connection String
            Connectie.ConnectionString = Connectiestring

        Catch oExcept As Exception
            MessageBox.Show(oExcept.Message, _
             "btnConnect_Click()")

        End Try

    End Sub

End Module

Nu kan ik mijn programma doen:
connectie.close
en
connectie.open
en
connect.connect

En deze heb ik ook nog voor een sql connectie.
Het makkelijke is dat je altijd je alleen maar je config file hoeft te wijzigen bij de klant.

The best thing about UDP jokes is that I don't care if you get them or not.


Verwijderd

Topicstarter
Remc0 schreef op 01 juli 2004 @ 20:38:
Ik doe altijd het volgende:

Maak een app.config file aan met de volgende inhoud:
code:
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="path" value="C:\Documents and Settings\Remco\Bureaublad\bladiebla.mdb" />
<add key="userid" value="admin" />
<add key="password" value="" />
</appSettings>
</configuration>

Nu maak ik ook nog een module aan connect.vb
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Module connect
    Public Connectie As OleDb.OleDbConnection
    Public Connectiestring As String
    Public config As Configuration.ConfigurationSettings


    Public Sub connect()
        Try
            ' Create the Connection object
            Connectie = New OleDb.OleDbConnection
            ' Build the connection string
            Connectiestring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
            Connectiestring &= config.AppSettings("path")
            Connectiestring &= ";User Id="
            Connectiestring &= config.AppSettings("userid")
            Connectiestring &= ";Password="
            Connectiestring &= config.AppSettings("password")
            Connectiestring &= ";"
            ' Set the Connection String
            Connectie.ConnectionString = Connectiestring

        Catch oExcept As Exception
            MessageBox.Show(oExcept.Message, _
             "btnConnect_Click()")

        End Try

    End Sub

End Module

Nu kan ik mijn programma doen:
connectie.close
en
connectie.open
en
connect.connect

En deze heb ik ook nog voor een sql connectie.
Het makkelijke is dat je altijd je alleen maar je config file hoeft te wijzigen bij de klant.
Probleem is hierbij dat de database nog steeds ergens vast ingegeven wordt, de connection-string wordt niet samengesteld uit stukken van de config-filie.

Met niet werken bedoel ik: het programma loopt gewoon vast. Het programma moet connecten met de database en nadien een sql-statement uitvoeren. Maar de connection-string wordt blijkbaar niet geldig aanvaard en het duurt dus oneindig lang om een verbinding te maken (de dsn bestaat namelijk niet)

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Euh, nee, je config file staat in een stuk in je config file.
Wat is het wezenlijke verschil tussen een conn. string die in één stuk in je config file staat, en een conn. string die in meerdere stukken verspreid over je config file staat, behalve het feit dat je in het 2de geval meer complexiteit gaat hebben?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 01 juli 2004 @ 23:25:
Euh, nee, je config file staat in een stuk in je config file.
Wat is het wezenlijke verschil tussen een conn. string die in één stuk in je config file staat, en een conn. string die in meerdere stukken verspreid over je config file staat, behalve het feit dat je in het 2de geval meer complexiteit gaat hebben?
Dat de gebruiker dan de volledige connectionstring moet kennen, wat ik niet wil. Ik wil dat de gebruiker met de informatie die hij krijgt van de host meteen een connectie kan maken, dus enkel dingen als DSN, Username, PWD en Database moet ingeven. De rest van de connectionstring maak ik er zelf rond. Of ik dat dan in de config-file doe of in het programma zelf is ongeveer even moeilijk veronderstel ik. Het is net dat samenstellen van de connectionstring dat voor problemen zorgt.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Ben je eigenlijk wel zeker dat die connectionstring helemaal correct is?

Kijk aanders eens op www.connectionstrings.com

Welke exceptie wordt er gegooid?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 02 juli 2004 @ 11:53:
Ben je eigenlijk wel zeker dat die connectionstring helemaal correct is?

Kijk aanders eens op www.connectionstrings.com

Welke exceptie wordt er gegooid?
100% zeker dat hij correct is. Ik neem namelijk mijn oude connectionstring (met statische gegevens) en vervang eigenlijk enkel de DNS door de tekst die in de xml-file staat. Ik krijg geen exception, het programma crasht gewoon. (met crashen bedoel ik: als ik die bepaalde actie laat uitvoeren reageert hij gewoon niet meer, hij blijft gelijk continu naar de server zoeken)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op 02 juli 2004 @ 11:57:
[...]

100% zeker dat hij correct is. Ik neem namelijk mijn oude connectionstring (met statische gegevens) en vervang eigenlijk enkel de DNS door de tekst die in de xml-file staat. Ik krijg geen exception, het programma crasht gewoon. (met crashen bedoel ik: als ik die bepaalde actie laat uitvoeren reageert hij gewoon niet meer, hij blijft gelijk continu naar de server zoeken)
Probeer dan eens te achterhalen met de debugger op welk statement hij precies blijft hangen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 21-05 08:21
Verwijderd schreef op 01 juli 2004 @ 21:33:
[...]

Probleem is hierbij dat de database nog steeds ergens vast ingegeven wordt, de connection-string wordt niet samengesteld uit stukken van de config-filie.
:? ik snap je niet.
De xml file is de config file.
Je connectie string word dus samengesteld en hoef je niet meer te gebruiken.
Je krijgt dan zoiets:
code:
1
Dim mycommand = New SqlDataAdapter(sqlstring, Connectie)

The best thing about UDP jokes is that I don't care if you get them or not.


Verwijderd

Topicstarter
I feel so stupid :D . Er was nergens een fout in mijn code, de fout zat in de configfile :'( . Er stond gewoon een '/' waar een '\' moest staan en daardoor lukte het niet.

Sorry voor alle last jongens maar misschien kan ik dit topic nog eventjes gebruiken voor een ander "probleem".

Het programma maakt dus fotoboeken aan en op een moment kan je foto's selecteren. Die zie je dan onderaan in een preview-screen. Nu is het probleem dat je eens je een foto geselecteerd hebt, je die niet meer kan verwijderen, je kan enkel het programma afsluiten en opnieuw starten om een foute selectie te verbeteren, niet echt handig.

Ik zou dus graag door op delete te drukken een foto kunnen deleten uit een ListView. Kan iemand me zeggen of dit ten eerste wel mogelijk is (dus een selectie doen in een listview en door delete, die selectie deleten) en misschien een hint geven waarop ik kan zoeken?
Pagina: 1