[C#] Connecten beveiligde Access database

Pagina: 1
Acties:

  • ygma!l
  • Registratie: December 2002
  • Laatst online: 05-05 11:51
Ik heb een probleem met het connecten van een access (2002) database. Ik maak een OLEdbConnection aan en vervolgens probeer ik een connection string aan te maken met de wizard (OLE JET 4.0). Nu is het zo dat ik bij access een database password heb opgegeven. Deze geef ik in de wizard op bij password en bij user laat ik het op default staan (Admin) ook als ik niets invul gebeurt hetzelfde.

Als ik nu een connection test doe krijg ik de volgende foutmelding: "Microsoft data link-fout", "Verbindingstest is mislukt wegens een fout bij het initialiserven van de voorziening. Kan de toepassing niet starten. Het gegevens bestand van de werkgroep ontbreekt of is exclusief geopend door een andere gebruiker."

Mijn vraag is dus nu: hoe krijg ik het nu voor elkaar om met deze database te connecten die dus alleen een "database password" heeft. Ik snap er helemaal niets van.

  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 12-03 16:55
Het databasewachtwoord moet je opgeven in het laatste tabblad "Alles" van dat venster (het is namelijk geen wachtwoord van de gebruiker Admin).

Jet OLEDB:Database Password

  • ygma!l
  • Registratie: December 2002
  • Laatst online: 05-05 11:51
He, geweldig!! Het werkt!!
Hartstikke bedankt! :*)

  • ygma!l
  • Registratie: December 2002
  • Laatst online: 05-05 11:51
Nu heb ik nog een probleem door dit wactwoord verhaal....
Hierdoor krijg ik als ik data in een datareader wil stoppen de volgende foutmelding:
"An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in system.data.dll" :/

Iemand enig idee hoe dit kan? En hoe ik dit kan oplossen :?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
In een datareader kan je helemaal geen data stoppen.
Wat doe je precies? Een datareader is een read-only, forward only 'cursor'.

Trouwens, op welke lijn code krijg je die fout ? Kan je die exceptie niet verder uitspitten? Heeft die exceptie nog inner-exceptions, en wat bevat de message property van die inner-exceptions?

[ Voor 80% gewijzigd door whoami op 24-06-2004 15:26 ]

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Show is wat code :)

  • ygma!l
  • Registratie: December 2002
  • Laatst online: 05-05 11:51
Hieronder de code waar het fout gaat. Hierbij is condraaiboek een OLEDBConnection. Code werkt wel als er geen wachtwoord zit op de database. Maar MET wachtwoord werkie niet. En markeert hij regel 5.
code:
1
2
3
4
5
6
7
8
9
10
OleDbDataReader dtrtree;

condraaiboek.Open();

OleDbCommand comtree=new OleDbCommand("SELECT DISTINCT Week FROM boek ORDER BY Week", condraaiboek);
            
dtrtree=comtree.ExecuteReader();
while (dtrtree.Read())
{
}

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Hij kan dus niet geopent worden. Controleer je connection string is, hoe gebruik je die? Hoe ziet hij er uit.

Kijk voor connection string @ www.connectionstrings.com

  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 12-03 16:55
Dat is vreemd, want je connectie open je op regel 3. Als er iets niet goed is zou die daar eigenlijk al fout moeten gaan.

In Delphi moet je trouwens een query gebruiken als je een resultaat terug krijgt (Command wordt alleen voor queries zonder resultaat zoals INSERT, UPDATE, DELETE) Ik weet niet of dat hier ook van toepassing is (niet bekend met de taal waarin je werkt)

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Je zal die fout idd bij het openen van de connectie krijgen; dat regel 5 dan gemarkeerd is, doet niet terzake. Step eens met de debugger door je code, dan zal je zien dat de exceptie gegooid wordt op de lijn waarop je de connectie opent.

Er zal dus idd iets mis zijn met de connectie-string. Hoe ziet die er uit? Kijk ook eens op die site die questa post; misschien vind je daar wel hoe je dat wachtwoord goed moet meesturen.
In Delphi moet je trouwens een query gebruiken als je een resultaat terug krijgt (Command wordt alleen voor queries zonder resultaat zoals INSERT, UPDATE, DELETE) Ik weet niet of dat hier ook van toepassing is (niet bekend met de taal waarin je werkt)
Nee, een command gebruik je hier om een SQL commando uit te voeren; dat kan een SELECT, DELETE, whatever zijn. Je moet er enkel voor zorgen dat de juiste member method v/h command aangeroepen wordt.

[ Voor 62% gewijzigd door whoami op 24-06-2004 15:56 ]

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

whoami schreef op 24 juni 2004 @ 15:54:
Je zal die fout idd bij het openen van de connectie krijgen; dat regel 5 dan gemarkeerd is, doet niet terzake.
Hij markeerd de eerst volgende regel altijd geel bij een exception, dacht ik. Verder nooit op gelet eigelijk.

Het komt bij mij ook vaker voor.

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Zet eens een BreakPoint op de regel bij je verbinding en stap met f10 door de code heen. Zo kun je makkelijk zien waar de fout zit.

offtopic:
Ik gebruik msn op stage, dus je kunt wel vrage aan mij. Ik programmeer nu in .NET op stage. Tenminste jij bent toch Jasper Slot :?

[ Voor 38% gewijzigd door eghie op 24-06-2004 15:59 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
questa schreef op 24 juni 2004 @ 15:56:
[...]


Hij markeerd de eerst volgende regel altijd geel bij een exception, dacht ik. Verder nooit op gelet eigelijk.
Dat is normaal. Het geel gemarkeerde statement is het 'current' statement.
In dit geval is connection.Open() uitgevoerd, maar dat statement heeft een exceptie gegooid, connectie.Open() is dus niet meer geel, omdat dat statement uitgevoerd is.

't Is soms best verwarrend, maar de exceptie werd dus gegeven op connectie.Open().

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Je connectiestring moet er dus ongeveer zo uitzien:

code:
1
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\somepath\mydb.mdb;Jet OLEDB:Database Password=MyDbPassword;"


Je moet trouwens ook weten dat een DataReader een connectie exclusief 'bezet' houdt.
Als je je datareader dus niet meer gebruikt, dan moet je je datareader en je connectie sluiten.
Je kan dus geen andere DB operaties uitvoeren met die connectie als die datareader of die connectie nog open staan.

https://fgheysels.github.io/


  • ygma!l
  • Registratie: December 2002
  • Laatst online: 05-05 11:51
Ik heb nu zo mijn code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
OleDbDataReader dtrtree;

OleDbConnection condraaiboek=new OleDbConnection(
                @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=draaiboek.mdb;Jet OLEDB:Database Password=*******;");

condraaiboek.Open();

OleDbCommand comtree=new OleDbCommand("SELECT DISTINCT Week FROM boek ORDER BY Week", condraaiboek);
            
dtrtree=comtree.ExecuteReader();
while (dtrtree.Read())
            {
                
            }

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

ygma!l schreef op 24 juni 2004 @ 16:11:
Ik heb nu zo mijn code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
OleDbDataReader dtrtree;

OleDbConnection condraaiboek=new OleDbConnection(
                @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=draaiboek.mdb;Jet OLEDB:Database Password=*******;");

condraaiboek.Open();

OleDbCommand comtree=new OleDbCommand("SELECT DISTINCT Week FROM boek ORDER BY Week", condraaiboek);
            
dtrtree=comtree.ExecuteReader();
while (dtrtree.Read())
            {
                
            }
Wat wil je ermee dan :?
Mischien zijn er andere betere/snellere oplossingen.

Trouwens, we hebben op school wel leuk geleerd om die datareader te gebruiken, maar soms kun je beter gewoon een dataset gebruiken. Werkt makkelijker/fijner.

[ Voor 14% gewijzigd door eghie op 24-06-2004 16:22 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Ik vind dat je een datareader best kan gebruiken, maar dan niet buiten je DAL.

Je kan die datareader best gebruiken om een array / collection oid mee te vullen, en die collectie dan te returnen.

Ik zie trouwens dat je in je connection string bij datasource wel de naam van je mdb file hebt gezet, maar het pad ernaartoe niet. Ik denk dat het zowiezo beter zou zijn als je daar het volledige path zet.

Kan je met diezelfde connectionstring een dataset opvullen ?

[ Voor 42% gewijzigd door whoami op 24-06-2004 16:28 ]

https://fgheysels.github.io/


  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

whoami schreef op 24 juni 2004 @ 16:27:
Ik vind dat je een datareader best kan gebruiken, maar dan niet buiten je DAL.

Je kan die datareader best gebruiken om een array / collection oid mee te vullen, en die collectie dan te returnen.

Ik zie trouwens dat je in je connection string bij datasource wel de naam van je mdb file hebt gezet, maar het pad ernaartoe niet. Ik denk dat het zowiezo beter zou zijn als je daar het volledige path zet.

Kan je met diezelfde connectionstring een dataset opvullen ?
Dat klopt, daar gebruik ik het ook meestal wel gewoon voor, maar dat is ook het enige waarvoor ik dat dus gebruik.

Trouwens volgens mij hoeft dat niet het volledige pad in je connection string. Hij zegt trouwens ook dat het zonder wachtwoord wel werkt (wel ander bestand). Ik denk trouwens dat het niet handig is om het pad erin te gaan proppen. Helemaal niet als je het pakket echt in gebruik gaat nemen. Je kunt dat dan wel op een of andere manier toch dynamisch maken dmv. OpenDialog/Application path, maar dat werkt soms niet helemaal fijn.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

eghie schreef op 24 juni 2004 @ 16:45:
[...]OpenDialog/Application path, maar dat werkt soms niet helemaal fijn.
De connection string gewoon in je application config file opnemen.

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

questa schreef op 24 juni 2004 @ 17:01:
[...]


De connection string gewoon in je application config file opnemen.
Daar had ik nog niet eens aan gedacht.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

eghie schreef op 24 juni 2004 @ 17:30:
[...]

Daar had ik nog niet eens aan gedacht.
Wel verstandig is zeker als je met wachtwoord werkt, even je string te encrypte.

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

gorgi_19

Kruimeltjes zijn weer op :9

questa schreef op 24 juni 2004 @ 17:47:
[...]


Wel verstandig is zeker als je met wachtwoord werkt, even je string te encrypte.
Waarbij je je moet afvragen of dat de moeite wel is, aangezien het gruwelijk eenvoudig te decompilen is en ik me afvraag of je dit goed voor elkaar krijgt met obfucation.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

gorgi_19 schreef op 24 juni 2004 @ 17:50:
[...]

Waarbij je je moet afvragen of dat de moeite wel is, aangezien het gruwelijk eenvoudig te decompilen is en ik me afvraag of je dit goed voor elkaar krijgt met obfucation.
Als jij je connectionstring in je .exe.config file zet en hem encrypt hoeven ze niet eens te decompilen want het is gewoon een XML-file. Maar zo'n probleem is het niet, zeker voor een acces database is dit niet echt erg als dit geript zou worden.

Waar slaat gorgi_19 ze dan op? :)

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

gorgi_19

Kruimeltjes zijn weer op :9

Waar slaat gorgi_19 ze dan op?
Mijn punt is dat encryption in deze vorm een beetje nutteloos is om toe te voegen; zonde van je werk:) Ik heb niets gezegd over de locatie van opslaan. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

gorgi_19 schreef op 24 juni 2004 @ 17:54:
[...]

Mijn punt is dat encryption in deze vorm een beetje nutteloos is om toe te voegen; zonde van je werk:) Ik heb niets gezegd over de locatie van opslaan. :)
Het gaat er om dat de gebruiker je wachtwoord niet snel zien. Als ze willen komen ze er wel.

Maar questa heeft je iid niets horen zeggen over de locatie. Maar als de gebruiker je config file open en hij ziet zo in 1x het wachtwoord vind ik niet echt netjes staan.

  • ygma!l
  • Registratie: December 2002
  • Laatst online: 05-05 11:51
Uhm.... het probleem is eigenlijk heel simpel: ik kan de database niet benaderen doordat het wachtwoord op de access database zit. Uiteraard weet ik het wachtwoord en ook geef ik die op zoals in mijn code te zien is, alleen krijg ik dus steeds weer die foutmelding... :/

Als ik het wachtwoord van de database afhaal werkt het namelijk wel O-) Alleen is dat niet de oplossing, omdat de access database 'beveiligt' moet blijven.

====Edit====
Wat ik niet snap: als ik een connectie string aanmaak met de wizard in geval van een database ZONDER wachtwoord werkt het (zoals bekend). maar als ik deze connectie string gebruik in code, werkt het niet 8)7

====Edit2====
Als ik in de code het datareader gedeelte weglaat, dan krijg ik geen foutmeldingen :|

[ Voor 31% gewijzigd door ygma!l op 25-06-2004 10:19 ]


  • ygma!l
  • Registratie: December 2002
  • Laatst online: 05-05 11:51
Zo, ik geloof dat het aan de datareader ligt, want met de dataset wil het wel |:(
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dadraaiboek=new OleDbDataAdapter();

OleDbConnection condraaiboek=new OleDbConnection(
                @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=draaiboek.mdb;Jet OLEDB:Database Password=*******;");

OleDbCommand comtree=new OleDbCommand("SELECT DISTINCT Week FROM boek ORDER BY Week");


dadraaiboek.SelectCommand=comtree;
dadraaiboek.SelectCommand.Connection=condraaiboek;
DataSet ds=new DataSet();

dadraaiboek.Fill(ds);
            
foreach (DataRow dr in ds.Tables[0].Rows) 
{ 
   combobox.Items.Add(dr[0].ToString());
}

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Test je connection state is.

Je kunt de state controleren met:

C#:
1
2
3
4
5
6
7
8
if( dbConn.State == ConnectionState.Open )
{
     // blaat
}
else
{
     // blaat
}

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
In deze post geeft de TS al aan dat hij z'n connectie expliciet opent, dus dat zal wel het probleem niet zijn vermoed ik....

Het is natuurlijk wel zo dat een DataAdapter zelf zorgt voor he openen/sluiten van een connectie als je ze zelf niet expliciet geopend hebt.

https://fgheysels.github.io/


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 19:43

GrimaceODespair

eens een tettenman, altijd ...

OVer dat openen van die database: als je aan connection pooling doet, kan het gebeuren dat je connectie wel opent (maar niet heus, alleen de pool wordt nog maar geraadpleegd), en dan pas fout gaat als je er iets mee doet. Je moet dus eerst 100% zeker zijn dat je connectie wel openstaat, voordat je de fout elders zoekt.

Laatst een goed stuk over gelezen, weet alleen niet meer waar :X

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • ygma!l
  • Registratie: December 2002
  • Laatst online: 05-05 11:51
Ik heb het inmiddels ook voor elkaar met een datareader :*)
Het heeft volgens mij idd aan de connectie string gelegen...
Dit is zoals ik mijn connectie string nu heb:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Jet OLEDB:Global Partial Bulk Ops=2;
Jet OLEDB:Registry Path=;
Jet OLEDB:Database Locking Mode=1;
Data Source=database.mdb;
Mode=Share Deny None;
Jet OLEDB:Engine Type=5;
Provider=Microsoft.Jet.OLEDB.4.0;
Jet OLEDB:System database=;
Jet OLEDB:SFP=False;
persist security info=False;
Extended Properties=;
Jet OLEDB:Compact Without Replica Repair=False;
Jet OLEDB:Encrypt Database=False;
Jet OLEDB:Create System Database=False;
Jet OLEDB:Don't Copy Locale on Compact=False;
User ID=Admin;
Jet OLEDB:Global Bulk Transactions=1; 
Jet OLEDB:Database Password=*********;

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

In je connection string staat aardig wat onnodige data. Heb je al is 1 voor 1 settings weggelaten?

  • ygma!l
  • Registratie: December 2002
  • Laatst online: 05-05 11:51
Ik loop op moment weer tegen een probleemje aan... Ik wil namelijk een aantal textboxen via databindings verbinden met de database. Nu is het zo dat wanneer ik een OLEDBconnection en OLEDBadapter maak in design mode werkt het niet. Dit komt omdat ik de connectie string niet goed kan krijgen die in de server explorer komt te staan. Die neemt namelijk niet de 'wachtwoord optie' mee in de connectie string.

Mijn vraag: weet iemand hoe ik de connectie string die tijdens design time wordt gebruikt kan aanpassen??

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Waar in designtime, als je je connection toevoegd aan een Form, Control of Component komt hij onderin te staan in je design tab. Als je deze selecteerd en kies voor properties kun je toch ze connection string wijzigen? :?

* pjvandesande is bang dat hij je vraag niet heeft begrepen.

  • ygma!l
  • Registratie: December 2002
  • Laatst online: 05-05 11:51
questa schreef op 28 juni 2004 @ 17:19:
Waar in designtime, als je je connection toevoegd aan een Form, Control of Component komt hij onderin te staan in je design tab. Als je deze selecteerd en kies voor properties kun je toch ze connection string wijzigen? :?

* ygma!l is bang dat hij je vraag niet heeft begrepen.
Ja, je kunt bij de properties tijdens design time bij de OLEDBconnection de connectie string aanpassen, maar als je dat wilt doen van de OLEDBadapter kan het niet. Je krijgt dan een wizard waarin je een bestaande connectie string moet kiezen, maar die wordt niet aangemaakt terwijl je hem wijzigt in je connection. Die wizard zoekt dan naar een connectiestring in je 'server explorer' en die connectie string(s) kun je niet aanpassen...

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Kan je geen connectionstring aanmaken in je server explorer dan ?

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

Die propertie is readonly, maar je kan je connectie toch wel in je server explorer weer veranderen.

Kies dan niet voor 'properties', maar voor 'modify connection'. Dan kun je gewoon alles weer aanpassen.

  • ygma!l
  • Registratie: December 2002
  • Laatst online: 05-05 11:51
questa schreef op 28 juni 2004 @ 22:24:
Die propertie is readonly, maar je kan je connectie toch wel in je server explorer weer veranderen.

Kies dan niet voor 'properties', maar voor 'modify connection'. Dan kun je gewoon alles weer aanpassen.
Ik kan alleen niet kiezen voor 'modify connection' :/ Ik heb al geprobeerd om de connectie eerst te sluiten. En ik heb al geprobeerd door bij de componenten de connectie weg te halen, maar ik kan niet voor 'modidfy connection' kiezen... (Blijft grijs)

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 21-05 14:59

pjvandesande

GC.Collect(head);

ygma!l schreef op 29 juni 2004 @ 09:04:
[...]

Ik kan alleen niet kiezen voor 'modify connection' :/ Ik heb al geprobeerd om de connectie eerst te sluiten. En ik heb al geprobeerd door bij de componenten de connectie weg te halen, maar ik kan niet voor 'modidfy connection' kiezen... (Blijft grijs)
Dan heb ik iig niet zo even snel een oplossing. Maar waarom dan niet even handmatig in je source editten?

  • ygma!l
  • Registratie: December 2002
  • Laatst online: 05-05 11:51
questa schreef op 29 juni 2004 @ 19:56:
[...]


Dan heb ik iig niet zo even snel een oplossing. Maar waarom dan niet even handmatig in je source editten?
Op de een of andere manier kan ik niet de connectie string van de dataadapter goed krijgen in de source, als ik deze aanpas dan werkt het nog niet in design mode. Zoals ik al eerder hierboven vermeld hebt kan ik alles werkende krijgen indien ik alles 'on code' aanmaak. Ik vind het heel vreemd dat het niet wil als ik het in design mode doe.

Volgens mij zit er nog maar 1 ding op: alle textboxen 'on code' configureren voor een data connectie :|
Pagina: 1