Discussion:
Access2007: Alter Database Password funktioniert nicht
(zu alt für eine Antwort)
Manuel Kobloch
2010-04-07 13:54:37 UTC
Permalink
Hallo,

ich habe eine Access 2007 Datenbank (ohne Kennwort) und öffne sie auch mit
Access 2007 im exklusiv-Modus. Ich erstelle eine neue Abfrage im SQL Editor
und gebe folgendes ein, von dem ich erwarte, dass es ein Datenbank Kennwort
setzt.

"ALTER DATABASE PASSWORD Michael NULL

Aber es kommt nur die Meldung: "Unzulässige SQL-Anweisung "DELETE",
"INSERT", "SELECT", "PROCEDURE", oder "UPDATE" erwartet."

Was mache ich falsch?

Selbst wenn ich per Hand das Datenbankkennwort auf "test" setze und dann
eingebe

"ALTER DATABASE PASSWORD Michael test"

kommt diese Meldung. Andere ALTER Befehle wie z.B. ALTER TABLE ADD COLUMN
funktionieren ohne Probleme.

Grüße

Manuel
Thomas Möller
2010-04-07 15:34:41 UTC
Permalink
Hallo Manuel,
Post by Manuel Kobloch
ich habe eine Access 2007 Datenbank (ohne Kennwort) und öffne sie auch
mit Access 2007 im exklusiv-Modus. Ich erstelle eine neue Abfrage im SQL
Editor und gebe folgendes ein, von dem ich erwarte, dass es ein
Datenbank Kennwort setzt.
"ALTER DATABASE PASSWORD Michael NULL
Aber es kommt nur die Meldung: "Unzulässige SQL-Anweisung "DELETE",
"INSERT", "SELECT", "PROCEDURE", oder "UPDATE" erwartet."
Was mache ich falsch?
IMHO musst Du das per ADO erledigen. Schau Dir mal diesen Artikel an:
http://support.microsoft.com/kb/304915
(Link in einer Zeile)


HTH
--
Thomas

Homepage: www.Team-Moeller.de
Karl Donaubauer
2010-04-07 18:14:21 UTC
Permalink
Post by Manuel Kobloch
ich habe eine Access 2007 Datenbank (ohne Kennwort) und öffne sie
auch mit Access 2007 im exklusiv-Modus. Ich erstelle eine neue
Abfrage im SQL Editor und gebe folgendes ein, von dem ich erwarte,
dass es ein Datenbank Kennwort setzt.
"ALTER DATABASE PASSWORD Michael NULL
Aber es kommt nur die Meldung: "Unzulässige SQL-Anweisung "DELETE",
"INSERT", "SELECT", "PROCEDURE", oder "UPDATE" erwartet."
Was mache ich falsch?
Selbst wenn ich per Hand das Datenbankkennwort auf "test" setze und
dann eingebe
"ALTER DATABASE PASSWORD Michael test"
kommt diese Meldung. Andere ALTER Befehle wie z.B. ALTER TABLE ADD
COLUMN funktionieren ohne Probleme.
Wie Thomas schon schrieb, funktioniert "ALTER DATABASE PASSWORD"
nur mit ADO, denn es ist eine der nur für den OLE DB Provider zugänglichen
JET SQL Erweiterungen ab A00. Man braucht allerdings keinen
ADO-Verweis sondern z.B. bloß das entsprechende Execute mit
einer Codezeile wie:

CurrentProject.Connection.Execute _
"ALTER DATABASE PASSWORD Michale NULL"

Wenn du das außerhalb von VBA als Abfrage ausführen willst,
musst du in den Access-Optionen die SQL Server-kompatible
Syntax (ANSI 92) einschalten.

Das hat allerdings auch andere Auswirkungen. Z.B. musst du dann
statt des Asterisken * das Prozentzeichen % als Platzhalter in Abfragen
einsetzen. Wird sich also kaum lohnen, außer du wechselst ständig
das Kennwort.
--
Servus
Karl
****************
Access-FAQ: http://www.donkarl.com
Manuel Kobloch
2010-04-08 07:29:10 UTC
Permalink
Super, vielen Dank! Der Befehl oAccess.CurrentProject.Connection.Execute war
genau das, was ich brauchte!

Ich erstelle von C#3.5 aus eine Access 2007 Datenbank. Für alle, die das
selbe Problem haben (und ich habe lange gegoogelt) hier die Lösung.

using Access = Microsoft.Office.Interop.Access;
...

oAccess.NewCurrentDatabase("D:\meinOrdner\test.accdb");
oAccess.DoCmd.RunSQL("CREATE TABLE Test", false);
oAccess.DoCmd.RunSQL("ALTER TABLE Test add Gender char(1)",
false);
object datensätzeBetroffen;
oAccess.CurrentProject.Connection.Execute("ALTER DATABASE
PASSWORD meinPasswort NULL", out datensätzeBetroffen, 0);
oAccess.CloseCurrentDatabase();
oAccess.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveAll);

viele Grüße

Manuel
Post by Karl Donaubauer
Post by Manuel Kobloch
ich habe eine Access 2007 Datenbank (ohne Kennwort) und öffne sie
auch mit Access 2007 im exklusiv-Modus. Ich erstelle eine neue
Abfrage im SQL Editor und gebe folgendes ein, von dem ich erwarte,
dass es ein Datenbank Kennwort setzt.
"ALTER DATABASE PASSWORD Michael NULL
Aber es kommt nur die Meldung: "Unzulässige SQL-Anweisung "DELETE",
"INSERT", "SELECT", "PROCEDURE", oder "UPDATE" erwartet."
Was mache ich falsch?
Selbst wenn ich per Hand das Datenbankkennwort auf "test" setze und
dann eingebe
"ALTER DATABASE PASSWORD Michael test"
kommt diese Meldung. Andere ALTER Befehle wie z.B. ALTER TABLE ADD
COLUMN funktionieren ohne Probleme.
Wie Thomas schon schrieb, funktioniert "ALTER DATABASE PASSWORD"
nur mit ADO, denn es ist eine der nur für den OLE DB Provider zugänglichen
JET SQL Erweiterungen ab A00. Man braucht allerdings keinen
ADO-Verweis sondern z.B. bloß das entsprechende Execute mit
CurrentProject.Connection.Execute _
"ALTER DATABASE PASSWORD Michale NULL"
Wenn du das außerhalb von VBA als Abfrage ausführen willst,
musst du in den Access-Optionen die SQL Server-kompatible
Syntax (ANSI 92) einschalten.
Das hat allerdings auch andere Auswirkungen. Z.B. musst du dann
statt des Asterisken * das Prozentzeichen % als Platzhalter in Abfragen
einsetzen. Wird sich also kaum lohnen, außer du wechselst ständig
das Kennwort.
--
Servus
Karl
****************
Access-FAQ: http://www.donkarl.com
Josef Poetzl
2010-04-08 08:37:21 UTC
Permalink
Hallo!
Post by Manuel Kobloch
Ich erstelle von C#3.5 aus eine Access 2007 Datenbank.
Benötigst du dafür überhaupt Access?

Zum Ausführen der DDL-Anweisungen (create table, alter table,...)
könntest du OleDbConnection & Co. verwenden.

Zum Erstellen der DB wirst du aber eventuell auf ADOX ausweichen
müssen - zumindest weiß ich nicht, wie man das nur über ADO.net
erledigen könnte.

ADOX-Variante:
new ADOX.Catalog().Create("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\\eine\\datei.accdb;Jet OLEDB:Engine Type=5;");


mfg
Josef
--
Code-Bibliothek für Access-Entwickler: http://access-codelib.net/
Access-FAQ von Karl Donaubauer: http://www.donkarl.com/
C. Sekulla
2010-04-08 11:11:36 UTC
Permalink
Hi,
danke der Hinweis lag mir auch schon auf der Zunge ;-)
Post by Josef Poetzl
Zum Ausführen der DDL-Anweisungen (create table, alter table,...)
könntest du OleDbConnection & Co. verwenden.
Denn so braucht die Anwendung immer ein funktionierendes ACCESS
(ggf. sogar in der richtigen Version).
Post by Josef Poetzl
Zum Erstellen der DB wirst du aber eventuell auf ADOX ausweichen
müssen - zumindest weiß ich nicht, wie man das nur über ADO.net
erledigen könnte.
new ADOX.Catalog().Create("Provider=Microsoft.ACE.OLEDB.12.0;Data
Source=D:\\eine\\datei.accdb;Jet OLEDB:Engine Type=5;");
Oder einmal ein leere DB erstellen und in das Projekt einbinden und mit
SQL-Befehlen bearbeiten.
cu CS
Manuel Kobloch
2010-04-11 13:37:53 UTC
Permalink
Das Setup von unserem Programm installiert die jeweilige Access Runtime auf
den Rechner. Daher ist im Grunde immer ein funktionierendes Access auf dem
System.

Eine Access-Datenbank in die Ressourcen zu stecken wäre auch eine
Möglichkeit. Doch wüsste ich dann nicht, wie ich die Datenbank reparieren
und komprimieren sollte, da dies mein Programm hin und wieder auch machen
sollte.

Ich habe da noch ein Problem, auf dem ich eben erst gestoßen bin:

Ich erstelle die AccessDatenbank mit meiner hier vorgestellten Lösung. Und
obwohl ich am Ende folgende zwei Befehle ausführe, kann ich mit einer
anderen Klasse nicht auf die erstellte Access Datei per OleDB zugreifen.

oAccess.CloseCurrentDatabase();
oAccess.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveAll);

es kommt immer die Fehlermeldung, dass die Access-Datei schon in Benutzung
ist. Sowas wie ein oAccess.dispose() habe ich nirgends gefunden. Ein oAccess
= null hat auch nichts gebracht.

Hat da jemand eine Idee?

Grüße

Michael
Post by C. Sekulla
Hi,
danke der Hinweis lag mir auch schon auf der Zunge ;-)
Post by Josef Poetzl
Zum Ausführen der DDL-Anweisungen (create table, alter table,...)
könntest du OleDbConnection & Co. verwenden.
Denn so braucht die Anwendung immer ein funktionierendes ACCESS
(ggf. sogar in der richtigen Version).
Post by Josef Poetzl
Zum Erstellen der DB wirst du aber eventuell auf ADOX ausweichen
müssen - zumindest weiß ich nicht, wie man das nur über ADO.net
erledigen könnte.
new ADOX.Catalog().Create("Provider=Microsoft.ACE.OLEDB.12.0;Data
Source=D:\\eine\\datei.accdb;Jet OLEDB:Engine Type=5;");
Oder einmal ein leere DB erstellen und in das Projekt einbinden und mit
SQL-Befehlen bearbeiten.
cu CS
Winfried Sonntag
2010-04-11 14:04:40 UTC
Permalink
Post by Manuel Kobloch
Eine Access-Datenbank in die Ressourcen zu stecken wäre auch eine
Möglichkeit. Doch wüsste ich dann nicht, wie ich die Datenbank reparieren
und komprimieren sollte, da dies mein Programm hin und wieder auch machen
sollte.
www.donkarl.com?FAQ6.6 + www.donkarl.com?FAQ6.7 incl. weiterführende
Links helfen dir bestimmt.

Servus
Winfried
--
Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
KnowHow.mdb: http://www.freeaccess.de/knowhow.asp
Access-FAQ: http://www.donkarl.com/AccessFAQ.htm
Access-Stammtisch: http://www.access-muenchen.de
Josef Poetzl
2010-04-11 14:11:13 UTC
Permalink
Hallo!
Post by Manuel Kobloch
Das Setup von unserem Programm installiert die jeweilige Access Runtime auf
den Rechner. Daher ist im Grunde immer ein funktionierendes Access auf dem
System.
Und wenn du nur Jet bzw. ACE verwenden würdest, könntest du auf Access
verzichten. ... außer du benutzt es auch für etwas anderes.
Post by Manuel Kobloch
Eine Access-Datenbank in die Ressourcen zu stecken wäre auch eine
Möglichkeit. Doch wüsste ich dann nicht, wie ich die Datenbank reparieren
und komprimieren sollte, da dies mein Programm hin und wieder auch machen
sollte.
Dafür würde z. B. DAO bzw. ACEDAO ausreichen.
Post by Manuel Kobloch
Ich erstelle die AccessDatenbank mit meiner hier vorgestellten Lösung. Und
obwohl ich am Ende folgende zwei Befehle ausführe, kann ich mit einer
anderen Klasse nicht auf die erstellte Access Datei per OleDB zugreifen.
oAccess.CloseCurrentDatabase();
oAccess.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveAll);
es kommt immer die Fehlermeldung, dass die Access-Datei schon in Benutzung
ist. Sowas wie ein oAccess.dispose() habe ich nirgends gefunden. Ein oAccess
= null hat auch nichts gebracht.
Hat da jemand eine Idee?
Du musst vermutlich den GC dazu bringen, dass er sofort aufräumt.
Hast du es schon mit
Runtime.InteropServices.Marshal.ReleaseComObject(...) bzw.
GC.Collect() und GC.WaitForPendingFinalizers() versucht?

mfg
Josef
--
Code-Bibliothek für Access-Entwickler: http://access-codelib.net/
Access-FAQ von Karl Donaubauer: http://www.donkarl.com/
Manuel Kobloch
2010-04-11 14:48:16 UTC
Permalink
Hätte ich auch selbst drauf kommen können. Den CarbageCollector per Hand
gestartet und schon ist das Problem beseitigt. Danke für den Hinweis.

Zu den anderen Antworten:
Die Jet Engine möchte ich auf keinen Fall verwenden. Letztendlich benutze
ich auch den Microsoft.ACE.OLEDB.12.0 Provider, um auf die Access Datenbank
zuzugreifen. Doch ich kannte keine Möglichkeit auf diese Weise eine Access
Datenbank mit Kennwort zu erstellen und diese Access Datenbank hin und
wieder zu Komprimieren bzw. Reparieren. Deshalb verwende ich für das
Erstellen und Komprimieren zusätzlich noch diesen
Microsoft.Office.Interop.Access Service.

Für Vorschläge fürs bessere Vorgehen bin ich offen.

Vielen Dank nochmal für sämtliche Antworten.

Grüße

Manuel
Post by Josef Poetzl
Hallo!
Post by Manuel Kobloch
Das Setup von unserem Programm installiert die jeweilige Access Runtime auf
den Rechner. Daher ist im Grunde immer ein funktionierendes Access auf dem
System.
Und wenn du nur Jet bzw. ACE verwenden würdest, könntest du auf Access
verzichten. ... außer du benutzt es auch für etwas anderes.
Post by Manuel Kobloch
Eine Access-Datenbank in die Ressourcen zu stecken wäre auch eine
Möglichkeit. Doch wüsste ich dann nicht, wie ich die Datenbank reparieren
und komprimieren sollte, da dies mein Programm hin und wieder auch machen
sollte.
Dafür würde z. B. DAO bzw. ACEDAO ausreichen.
Post by Manuel Kobloch
Ich erstelle die AccessDatenbank mit meiner hier vorgestellten Lösung.
Und
obwohl ich am Ende folgende zwei Befehle ausführe, kann ich mit einer
anderen Klasse nicht auf die erstellte Access Datei per OleDB zugreifen.
oAccess.CloseCurrentDatabase();
oAccess.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveAll);
es kommt immer die Fehlermeldung, dass die Access-Datei schon in Benutzung
ist. Sowas wie ein oAccess.dispose() habe ich nirgends gefunden. Ein oAccess
= null hat auch nichts gebracht.
Hat da jemand eine Idee?
Du musst vermutlich den GC dazu bringen, dass er sofort aufräumt.
Hast du es schon mit
Runtime.InteropServices.Marshal.ReleaseComObject(...) bzw.
GC.Collect() und GC.WaitForPendingFinalizers() versucht?
mfg
Josef
--
Code-Bibliothek für Access-Entwickler: http://access-codelib.net/
Access-FAQ von Karl Donaubauer: http://www.donkarl.com/
Loading...